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

來源:互聯網
上載者:User

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

BKJIA推薦專題: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中的函數式構造的各種美妙之處,以及在日常編碼和工作中使用它們的方式。我們將從一些準系統開始,然後用它們查看一些更有趣的應用。


聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.