做者: 阮一峯 javascript
日期: 2012年4月 6日 html
誕生50多年以後,函數式編程(functional programming)開始得到愈來愈多的關注。 java
不只最古老的函數式語言Lisp重獲青春,並且新的函數式語言層出不窮,好比Erlang、clojure、Scala、F#等等。目前最當紅的Python、Ruby、Javascript,對函數式編程的支持都很強,就連老牌的面向對象的Java、面向過程的PHP,都忙不迭地加入對匿名函數的支持。愈來愈多的跡象代表,函數式編程已經再也不是學術界的最愛,開始大踏步地在業界投入實用。 程序員
也許繼"面向對象編程"以後,"函數式編程"會成爲下一個編程的主流範式(paradigm)。將來的程序員恐怕或多或少都必須懂一點。 編程
可是,"函數式編程"看上去比較難,缺少通俗的入門教程,各類介紹文章都充斥着數學符號和專用術語,讓人讀了如墜雲霧。就連最基本的問題"什麼是函數式編程",網上都搜不到易懂的回答。 函數式編程
下面是個人"函數式編程"學習筆記,分享出來,與你們一塊兒探討。內容不涉及數學(我也不懂Lambda Calculus),也不涉及高級特性(好比lazy evaluation和currying),只求儘可能簡單通俗地整理和表達,我如今所理解的"函數式編程"以及它的意義。 函數
我主要參了Slava Akhmechet的"Functional Programming For The Rest of Us"。 學習
1、定義 lua
簡單說,"函數式編程"是一種"編程範 spa
式"(programming paradigm),也就是如何編寫程序的方法論。
它屬於"結構化編程"的一種,主要思想是把運算過程儘可能寫成一系列嵌套的函數調用。舉例來講,如今有這樣一個數學表達式:
(1 + 2) * 3 - 4
傳統的過程式編程,可能這樣寫:
var a = 1 + 2;
var b = a * 3;
var c = b - 4;
函數式編程要求使用函數,咱們能夠把運算過程定義爲不一樣的函數,而後寫成下面這樣:
var result = subtract(multiply(add(1,2), 3), 4);
這就是函數式編程。
2、特色
函數式編程具備五個鮮明的特色。
1. 函數是"第一等公民"
所謂"第一等公民"(first class),指的是函數與其餘數據類型同樣,處於平等地位,能夠賦值給其餘變量,也能夠做爲參數,傳入另外一個函數,或者做爲別的函數的返回值。
舉例來講,下面代碼中的print變量就是一個函數,能夠做爲另外一個函數的參數。
var print = function(i){ console.log(i);}; [1,2,3].forEach(print);