偷偷摘套内射激情视频,久久精品99国产国产精,中文字幕无线乱码人妻,中文在线中文a,性爽19p

JavaScript中的函數(shù)式編程實(shí)踐

開發(fā) 前端
在這篇文章中,您將了解一些關(guān)于如何采用函數(shù)式風(fēng)格,用JavaScript編寫良好的、優(yōu)美的代碼的示例,包括函數(shù)式編程概念以及函數(shù)式概念的運(yùn)用。

函數(shù)式編程語(yǔ)言在學(xué)術(shù)領(lǐng)域已經(jīng)存在相當(dāng)長(zhǎng)一段時(shí)間了,但是從歷史上看,它們沒有豐富的工具和庫(kù)可供使用。隨著.NET平臺(tái)上的Haskell和F#函數(shù)式編程語(yǔ)言的出現(xiàn),其變得更加流行。一些傳統(tǒng)的編程語(yǔ)言,例如C++和JavaScript,也引入了由函數(shù)式編程提供的一些構(gòu)造和特性。

51CTO推薦專題:JavaScript函數(shù)式編程

在許多情況下,JavaScript的重復(fù)代碼導(dǎo)致了一些拙劣的編碼。如果使用函數(shù)式編程,就可以避免這些問題。此外,可以利用函數(shù)式編程風(fēng)格編寫更加優(yōu)美的回調(diào)。因?yàn)楹瘮?shù)式編程采用了完全不同的組織程序的方式,所以那些習(xí)慣于采用命令式范例的程序員可能會(huì)發(fā)現(xiàn)函數(shù)式編程有點(diǎn)難學(xué)。

函數(shù)式編程概念

在那些通過描述“如何做”指定解決問題的方法的語(yǔ)言中,許多開發(fā)人員都知道如何進(jìn)行編碼。例如,要編寫一個(gè)計(jì)算階乘的函數(shù),我可以編寫一個(gè)循環(huán)來描述程序,或者使用遞歸來查找所有數(shù)字的乘積。在這兩種情況下,計(jì)算的過程都在程序中進(jìn)行了詳細(xì)說明。清單1顯示了一個(gè)計(jì)算階乘的可能使用的C代碼。

  1. 清單 1. 過程風(fēng)格的階乘  
  2. int factorial (int n)  
  3. {  
  4.   if (n <= 0)  
  5.     return 1;  
  6.   else  
  7.     return n * factorial (n-1);  

這類語(yǔ)言也叫做過程性編程語(yǔ)言,因?yàn)樗鼈兌x了解決問題的過程。函數(shù)式編程與這個(gè)原理有顯著不同。在函數(shù)式編程中,需要描述問題“是什么”。 函數(shù)式編程語(yǔ)言又叫做聲明性語(yǔ)言。同樣的計(jì)算階乘的程序可以寫成所有到n的數(shù)字的乘積。計(jì)算階乘的典型函數(shù)式程序看起來如清單2中的示例所示。

  1. 清單 2. 函數(shù)式風(fēng)格的階乘  
  2. factorial n, where n <= 0  :1 
  3. factorial n    :foldr * 1 take n [1..] 

第二個(gè)語(yǔ)句指明要得到從1開始的前n個(gè)數(shù)字的列表(take n [1..]),然后找出它們的乘積,1 為基元。這個(gè)定義與前面的示例不同,沒有循環(huán)或遞歸。它就像階乘函數(shù)的算術(shù)定義。一旦了解了庫(kù)函數(shù)(take 和 foldr)和標(biāo)記(list notation [ ])的意義,編寫代碼就很容易,而且可讀性也很好。只用三行Miranda代碼就可以編寫例程,根據(jù)參數(shù),使用廣度優(yōu)先或深度優(yōu)先遍歷處理n叉樹的每個(gè)節(jié)點(diǎn),而且元素可以是任何通用類型。 
 
從歷史上看,函數(shù)式編程語(yǔ)言不太流行有各種原因。但是最近,有些函數(shù)式編程語(yǔ)言正在進(jìn)入計(jì)算機(jī)行業(yè)。其中一個(gè)例子就是.NET平臺(tái)上的Haskell。其他情況下,現(xiàn)有的一些語(yǔ)言借用了函數(shù)式編程語(yǔ)言中的一些概念。

一些C++實(shí)現(xiàn)中的迭代器和continuation,以及JavaScript中提供的一些函數(shù)式構(gòu)造(functional construct),就是這種借用的示例。但是,通過借用函數(shù)式構(gòu)造,總的語(yǔ)言編程范例并沒有發(fā)生變化。JavaScript并沒因?yàn)楹瘮?shù)式構(gòu)造的添加就變成了函數(shù)式編程語(yǔ)言。

這里我們主要討論了JavaScript中的函數(shù)式構(gòu)造的各種美妙之處,以及在日常編碼和工作中使用它們的方式。我們將從一些基本功能開始,然后用它們查看一些更有趣的應(yīng)用。

#p#

匿名函數(shù)

在JavaScript中,可以編寫匿名函數(shù)或沒有名稱的函數(shù)。為什么需要這樣的函數(shù)?請(qǐng)繼續(xù)往下讀,但首先我們將學(xué)習(xí)如何編寫這樣一個(gè)函數(shù)。如果擁有以下JavaScript 函數(shù):

  1. 清單 3. 典型的函數(shù)  
  2. function sum(x,y,z) {  
  3.   return (x+y+z);  

然后對(duì)應(yīng)的匿名函數(shù)看起來應(yīng)當(dāng)如下所示:

  1. 清單 4. 匿名函數(shù)  
  2. function(x,y,z) {  
  3.   return (x+y+z);  

要使用它,則需要編寫以下代碼:

  1. 清單 5. 應(yīng)用匿名函數(shù)  
  2. var sum = function(x,y,z) {  
  3.   return (x+y+z);  
  4. }(1,2,3);  
  5. alert(sum); 

使用函數(shù)作為值

也可以將函數(shù)作為值使用。還可以擁有一些所賦值是函數(shù)的變量。在***一個(gè)示例中,還可以執(zhí)行以下操作:

  1. 清單 6. 使用函數(shù)賦值  
  2. var sum = function(x,y,z) {  
  3.   return (x+y+z);  
  4. }  
  5. alert(sum(1,2,3)); 

在上面清單6的示例中,為變量sum賦的值是函數(shù)定義本身。這樣,sum就成了一個(gè)函數(shù),可以在任何地方調(diào)用。

調(diào)用函數(shù)的不同方法

JavaScript允許用兩種方式調(diào)用函數(shù),如清單7和8所示。

  1. 清單 7. 典型的函數(shù)應(yīng)用  
  2. alert (“Hello, World!");  
  3. 或  
  4. 清單 8. 用函數(shù)作為表達(dá)式  
  5. (alert) (“Hello, World!"); 

所以也可以編寫以下代碼:

  1. 清單 9. 定義函數(shù)之后就可以立即使用它  
  2. ( function(x,y,z) { return (x+y+z) } ) (1, 2, 3); 

可以在括號(hào)中編寫函數(shù)表達(dá)式,然后傳遞給參數(shù),對(duì)參數(shù)進(jìn)行運(yùn)算。雖然在清單8的示例中,有直接包含在括號(hào)中的函數(shù)名稱,但是按清單9中所示方式使用它時(shí),就不是這樣了。

#p#

將函數(shù)作為參數(shù)傳遞給其他函數(shù)

也可以將函數(shù)作為參數(shù)傳遞給其他函數(shù)。雖然這不是什么新概念,但是在后續(xù)的示例中大量的使用了這個(gè)概念??梢詡鬟f函數(shù)參數(shù),如清單10所示。

  1. 清單 10. 將函數(shù)作為參數(shù)傳遞,并應(yīng)用該函數(shù)  
  2. var passFunAndApply = function (fn,x,y,z) { return fn(x,y,z); };  
  3. var sum = function(x,y,z) {  
  4.   return x+y+z;  
  5. };  
  6. alert( passFunAndApply(sum,3,4,5) ); // 12 

執(zhí)行***一個(gè)alert語(yǔ)句輸出了一個(gè)大小為12的值。

使用函數(shù)式概念

前一節(jié)介紹了一些使用函數(shù)式風(fēng)格的編程概念。所給的示例并沒有包含所有的概念,它們?cè)谥匾苑矫嬉矝]有先后順序,只是一些與這個(gè)討論有關(guān)的概念而已。下面對(duì)JavaScript中的函數(shù)式風(fēng)格作一快速總結(jié):

◆函數(shù)并不總是需要名稱;
◆函數(shù)可以像其他值一樣分配給變量;
◆函數(shù)表達(dá)式可以編寫并放在括號(hào)中,留待以后應(yīng)用;
◆函數(shù)可以作為參數(shù)傳遞給其他函數(shù)。

這一節(jié)將介紹一些有效使用這些概念編寫優(yōu)美的JavaScript代碼的示例。

擴(kuò)展數(shù)組排序

先來編寫一個(gè)排序方法,可以根據(jù)數(shù)組元素的日期對(duì)數(shù)據(jù)進(jìn)行排序。用JavaScript編寫這個(gè)方法非常簡(jiǎn)單。數(shù)據(jù)對(duì)象的排序方法接受一個(gè)可選參數(shù),這個(gè)可選參數(shù)就是比較函數(shù)。在這里,需要使用清單11中的比較函數(shù)。

  1. 清單 11. 比較函數(shù)  
  2. function (x,y) {  
  3.  return x.date – y.date;  

要得到需要的函數(shù),請(qǐng)使用清單12的示例。

  1. 清單 12. 排序函數(shù)的擴(kuò)展  
  2. arr.sort( function (x,y) { return x.date – y.date; } ); 

其中 arr 是類型數(shù)組對(duì)象。排序函數(shù)會(huì)根據(jù)arr數(shù)組中對(duì)象的日期對(duì)所有對(duì)象進(jìn)行排序。比較函數(shù)和它的定義一起被傳遞給排序函數(shù),以完成排序操作。使用這個(gè)函數(shù):

◆每個(gè)JavaScript對(duì)象都有一個(gè)date屬性。

◆JavaScript的數(shù)組類型的排序函數(shù)接受可選參數(shù),可選參數(shù)是用來排序的比較函數(shù)。這與C庫(kù)中的qsort函數(shù)類似。

動(dòng)態(tài)生成HTML的優(yōu)美代碼

在這個(gè)示例中,將看到如何編寫優(yōu)美的代碼,從數(shù)組動(dòng)態(tài)地生成HTML??梢愿鶕?jù)從數(shù)據(jù)中得到的值生成表格?;蛘?,也可以用數(shù)組的內(nèi)容生成排序和未排序的列表。也可以生成垂直或水平的菜單項(xiàng)目。清單13中的代碼風(fēng)格通常被用來從數(shù)組生成動(dòng)態(tài)HTML。

  1. 清單 13. 生成動(dòng)態(tài) HTML 的普通代碼  
  2. var str=' ';  
  3. for (var i=0;i<arr.length;i++) {  
  4.   var element=arr[i];  
  5.   str+=... HTML generation code...  
  6. }  
  7. document.write(str); 

可以用清單14的代碼替換這個(gè)代碼。

  1. 清單 14. 生成動(dòng)態(tài) HTML 的通用方式  
  2. Array.prototype.fold=function(templateFn) {  
  3.   var len=this.length;  
  4.   var str=' ';  
  5.   for (var i=0 ; i<len ; i++)   
  6.  str+=templateFn(this[i]);  
  7.   return str;  
  8. }  
  9.  
  10. function templateInstance(element) {  
  11.   return ... HTML generation code ...  
  12. }  
  13.  
  14. document.write(arr.fold(templateInstance)); 

這里使用的是Array類型的prototype屬性定義新函數(shù)fold?,F(xiàn)在可以在后面定義的任何數(shù)組中使用該函數(shù)。

#p#

系列函數(shù)的應(yīng)用

考慮以下這種情況:想用一組函數(shù)作為回調(diào)函數(shù)。為實(shí)現(xiàn)這一目的,將使用window.setTimeout函數(shù),該函數(shù)有兩個(gè)參數(shù)。***個(gè)參數(shù)是在第二個(gè)參數(shù)表示的毫秒數(shù)之后被調(diào)用的函數(shù)。清單15顯示了完成此操作的一種方法。

  1. 清單 15. 在回調(diào)中調(diào)用一組函數(shù)  
  2. window.setTimeout(function(){alert(‘First!’);alert(‘Second!’);}, 5000); 

清單16顯示了完成此操作的更好的方式。

  1. 清單 16. 調(diào)用系列函數(shù)的更好的方式  
  2. Function.prototype.sequence=function(g) {  
  3.   var f=this;  
  4.   return function() {  
  5.     f();g();  
  6.   }  
  7. };  
  8. function alertFrst() { alert(‘First!’); }  
  9. function alertSec() { alert(‘Second!’); }  
  10. setTimeout( alertFrst.sequence(alertSec), 5000); 

在處理事件時(shí),如果想在調(diào)用完一個(gè)回調(diào)之后再調(diào)用一個(gè)回調(diào),也可以使用清單16中的代碼擴(kuò)展。這可能是一個(gè)需要您自行完成的一個(gè)練習(xí),現(xiàn)在您的興趣被點(diǎn)燃了吧。

結(jié)束語(yǔ)

在許多領(lǐng)域中都可以應(yīng)用JavaScript中的函數(shù)式編程,以優(yōu)美的方式完成日?;顒?dòng)。這篇文章中的示例只介紹了幾種情況。如果您找到了函數(shù)式編程的合適場(chǎng)景,并應(yīng)用這些概念,那么您就會(huì)有更多的理解,并且可以增加您的優(yōu)美程度。

【編輯推薦】

  1. 函數(shù)式語(yǔ)言基本知識(shí)
  2. 為什么大家都覺得函數(shù)式編程將會(huì)流行?
  3. Scala講座:函數(shù)式語(yǔ)言的體驗(yàn)
  4. 專訪鄧草原:從對(duì)象和函數(shù)式到現(xiàn)實(shí)世界的項(xiàng)目
  5. 結(jié)合實(shí)例理解F#函數(shù)式語(yǔ)言中的函數(shù)

 

責(zé)任編輯:王曉東 來源: IBM
相關(guān)推薦

2017-03-22 11:22:04

JavaScript函數(shù)式編程

2020-09-23 16:07:52

JavaScript函數(shù)柯里化

2016-08-11 10:34:37

Javascript函數(shù)編程

2016-08-11 10:11:07

JavaScript函數(shù)編程

2017-10-26 08:53:38

前端JavaScript函數(shù)式編程

2012-03-21 09:30:11

ibmdw

2019-01-17 10:25:56

Python編程語(yǔ)言程序員

2015-05-25 15:06:28

JavaScript函數(shù)式編程

2010-08-03 08:54:07

JDK 7Lambda表達(dá)式函數(shù)式編程

2019-08-06 09:00:00

JavaScript函數(shù)式編程前端

2017-10-17 16:23:58

函數(shù)式編程ReduxReact

2013-09-09 09:41:34

2012-09-21 09:21:44

函數(shù)式編程函數(shù)式語(yǔ)言編程

2016-10-19 14:35:20

JavaScript函數(shù)式編程

2024-12-05 10:37:36

Java純函數(shù)final

2020-02-06 19:12:36

Java函數(shù)式編程編程語(yǔ)言

2023-10-07 00:01:02

Java函數(shù)

2023-12-14 15:31:43

函數(shù)式編程python編程

2011-08-24 09:13:40

編程

2022-09-22 08:19:26

WebFlux函數(shù)式編程
點(diǎn)贊
收藏

51CTO技術(shù)棧公眾號(hào)