天天躁日日躁狠狠躁AV麻豆-天天躁人人躁人人躁狂躁-天天澡夜夜澡人人澡-天天影视香色欲综合网-国产成人女人在线视频观看-国产成人女人视频在线观看

用函數式編程技術編寫優美的 JavaScript_ibm

因為函數式編程采用了完全不同的組織程序的方式,所以那些習慣于采用命令式范例的程序員可能會發現函數式編程有點難學。在這篇文章中,您將了解一些關于如何采用函數式風格,用 JavaScript 編寫良好的、優美的代碼的示例。我將討論: 

函數式編程概念,包括匿名函數、調用函數的不同方法,以及將函數作為參數傳遞給其他函數的方式。

函數式概念的運用,采用的示例包括:擴展數組排序;動態 HTML 生成的優美代碼;系列函數的應用。 
函數式編程概念

 請告訴每個人。請把這個提交給:

  
  Digg  

  Slashdot  

 

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


清單 1. 過程風格的階乘

int factorial (int n)
{
  if (n <= 0)
    return 1;
  else
    return n * factorial (n-1);
}



這類語言也叫做過程性 編程語言,因為它們定義了解決問題的過程。函數式編程與這個原理有顯著不同。在函數式編程中,需要描述問題 “是什么”。 函數式編程語言又叫做聲明性 語言。同樣的計算階乘的程序可以寫成所有到 n 的數字的乘積。計算階乘的典型函數式程序看起來如 清單 2 中的示例所示。


清單 2. 函數式風格的階乘

factorial n, where n <= 0     := 1
factorial n    := foldr * 1 take n [1..]



第二個語句指明要得到從 1 開始的前 n 個數字的列表(take n [1..]),然后找出它們的乘積,1 為基元。這個定義與前面的示例不同,沒有循環或遞歸。它就像階乘函數的算術定義。一旦了解了庫函數(take 和 foldr)和標記(list notation [ ])的意義,編寫代碼就很容易,而且可讀性也很好。

 只用三行 Miranda 代碼就可以編寫例程,根據參數,使用廣度優先或深度優先遍歷處理 n 叉樹的每個節點,而且元素可以是任何通用類型。  

從歷史上看,函數式編程語言不太流行有各種原因。但是最近,有些函數式編程語言正在進入計算機行業。其中一個例子就是 .NET 平臺上的 Haskell。其他情況下,現有的一些語言借用了函數式編程語言中的一些概念。一些 C++ 實現中的迭代器和 continuation,以及 JavaScript 中提供的一些函數式構造(functional construct),就是這種借用的示例。但是,通過借用函數式構造,總的語言編程范例并沒有發生變化。JavaScript 并沒因為函數式構造的添加就變成了函數式編程語言。

我現在要討論 JavaScript 中的函數式構造的各種美妙之處,以及在日常編碼和工作中使用它們的方式。我們將從一些基本功能開始,然后用它們查看一些更有趣的應用

匿名函數

在 JavaScript 中,可以編寫匿名函數或沒有名稱的函數。為什么需要這樣的函數?請繼續往下讀,但首先我們將學習如何編寫這樣一個函數。如果擁有以下 JavaScript 函數: 
清單 3. 典型的函數

function sum(x,y,z) {
  return (x+y+z);
}




然后對應的匿名函數看起來應當如下所示: 
清單 4. 匿名函數

function(x,y,z) {
  return (x+y+z);
}




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


清單 5. 應用匿名函數

var sum = function(x,y,z) {
  return (x+y+z);
}(1,2,3);
alert(sum);



使用函數作為值

也可以將函數作為值使用。還可以擁有一些所賦值是函數的變量。在最后一個示例中,還可以執行以下操作: 
清單 6. 使用函數賦值

var sum = function(x,y,z) {
  return (x+y+z);
}
alert(sum(1,2,3));




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

調用函數的不同方法

JavaScript 允許用兩種方式調用函數,如清單 7 和 8 所示。 


清單 7. 典型的函數應用

alert (“Hello, World!");






清單 8. 用函數作為表達式

(alert) (“Hello, World!");



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


清單 9. 定義函數之后就可以立即使用它

( function(x,y,z) { return (x+y+z) } ) (1, 2, 3);



可以在括號中編寫函數表達式,然后傳遞給參數,對參數進行運算。雖然在 清單 8 的示例中,有直接包含在括號中的函數名稱,但是按 清單 9 中所示方式使用它時,就不是這樣了。

將函數作為參數傳遞給其他函數

也可以將函數作為參數傳遞給其他函數。雖然這不是什么新概念,但是在后續的示例中大量的使用了這個概念。可以傳遞函數參數,如 清單 10 所示。


清單 10. 將函數作為參數傳遞,并應用該函數

var passFunAndApply = function (fn,x,y,z) { return fn(x,y,z); };

var sum = function(x,y,z) {
  return x+y+z;
};

alert( passFunAndApply(sum,3,4,5) ); // 12



執行最后一個 alert 語句輸出了一個大小為 12 的值。

使用函數式概念

前一節介紹了一些使用函數式風格的編程概念。所給的示例并沒有包含所有的概念,它們在重要性方面也沒有先后順序,只是一些與這個討論有關的概念而已。下面對 JavaScript 中的函數式風格作一快速總結: 

函數并不總是需要名稱。 
函數可以像其他值一樣分配給變量。 
函數表達式可以編寫并放在括號中,留待以后應用。 
函數可以作為參數傳遞給其他函數。 

這一節將介紹一些有效使用這些概念編寫優美的 JavaScript 代碼的示例。(使用 JavaScript 函數式風格,可以做許多超出這個討論范圍的事。)

擴展數組排序 
先來編寫一個排序方法,可以根據數組元素的日期對數據進行排序。用 JavaScript 編寫這個方法非常簡單。數據對象的排序方法接受一個可選參數,這個可選參數就是比較函數。在這里,需要使用 清單 11 中的比較函數。

清單 11. 比較函數

function (x,y) {
    return x.date  主站蜘蛛池模板: 成人免费观看www视频 | 手机在线播放成人亚洲影院电影 | 99影视久久电影网久久看影院 | 精品免费视在线视频观看 | 欧美精品九九99久久在观看 | 国产永久视频 | 午夜福利32集云播 | 免费看的一级毛片 | 久爱在线中文在观看 | sm主人调教揉花蒂H SM双性精跪趴灌憋尿调教H | 97精品少妇偷拍AV | 丁香成人网址 | 美国色情三级欧美三级纸匠情挑 | 国产视频成人 | 欧美Av无码高清在线 | 丰满老熟好大bbbxxx | 亚洲精品无码午夜福利在线观看 | 99热久久这里只精品国产WWW | 高h喷水荡肉爽文总攻 | 乱h好大噗嗤噗嗤烂了 | 国产专区青青草原亚洲 | 波多野结衣 无码片 | 乌克兰女人与动ZOZO | 菲律宾毛片| 精品国产乱码久久久人妻 | 日本老妇一级特黄aa大片 | 免费国产综合视频在线看 | 色www精品视频在线观看 | 免费在线视频成人 | 日本漂亮妈妈7观整有限中 日本片bbbxxx | 日韩亚洲国产中文字幕欧美 | 久久九九亚洲精品 | 国产成人久视频免费 | 娇妻归来在线观看免费完整版电影 | 国产精品无码亚洲精品 | 杨幂被视频在线观看 | 涩里番app黄版网站 色综合伊人色综合网站中国 | 国产精品女上位在线观看 | 99视频偷窥在线精品国自产拍 | 国产不卡视频在线观看 | 91麻豆精品一二三区在线 |