天天看點

JavaScript中的函數式程式設計實踐(1)

  • JavaScript中的函數式程式設計實踐(1)
  • http://developer.51cto.com  2010-06-22 13:32  Bhattacharya  IBM  我要評論(0)
    在這篇文章中,您将了解一些關于如何采用函數式風格,用JavaScript編寫良好的、優美的代碼的示例,包括函數式程式設計概念以及函數式概念的運用。

    函數式程式設計語言在學術領域已經存在相當長一段時間了,但是從曆史上看,它們沒有豐富的工具和庫可供使用。随着.NET平台上的Haskell和F#函數式程式設計語言的出現,其變得更加流行。一些傳統的程式設計語言,例如C++和JavaScript,也引入了由函數式程式設計提供的一些構造和特性。

    51CTO推薦專題:JavaScript函數式程式設計

    在許多情況下,JavaScript的重複代碼導緻了一些拙劣的編碼。如果使用函數式程式設計,就可以避免這些問題。此外,可以利用函數式程式設計風格編寫更加優美的回調。因為函數式程式設計采用了完全不同的組織程式的方式,是以那些習慣于采用指令式範例的程式員可能會發現函數式程式設計有點難學。

    函數式程式設計概念

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

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

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

  1. 清單 2. 函數式風格的階乘  
  2. factorial n, where n <= 0  := 1 
  3. 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中的函數式構造的各種美妙之處,以及在日常編碼和工作中使用它們的方式。我們将從一些基本功能開始,然後用它們檢視一些更有趣的應用。