「函數式編程」是一種編程範式(programming paradigm),即如何編寫程序的方法論。主要思想是把運算過程儘可能寫成一系列嵌套的函數調用。編程
舉例來講,如今有這樣一個數學表達式:ide
(1 + 2) * 3 - 4函數式編程
傳統的過程式編程,可能這樣寫:函數
var a = 1 + 2;ip
var b = a * 3;開發
var c = b - 4;數學
函數式編程要求使用函數,咱們能夠把運算過程定義爲不一樣的函數,而後寫成下面這樣:io
var result = subtract(multiply(add(1,2), 3), 4);console
1. 函數是「頭等公民」(first class)function
指函數與其餘數據類型同樣,出於平等地位,能夠賦值給其餘變量,也能夠做爲參數,傳入另外一個函數,或者做爲別的函數的返回值。
舉例來講,下面代碼中的print變量就是一個函數,能夠做爲另外一個函數的參數。
var print = function(i){ console.log(i);};
[1,2,3].forEach(print);
2. 只用「表達式」,不用「statement」
「表達式」是一個單純運算的過程,總有返回值;「語句」是執行某種操做,沒有返回值。函數式編程要求,只使用表達式,不使用語句。也就是說,每一步都是單純的運算,並且都有返回值。
緣由是函數式編程的開發動機,一開始就是爲了處理運算(computation),不考慮系統的讀寫(I/O)。"語句"屬於對系統的讀寫操做,因此就被排斥在外。
3. 沒有「反作用」(side effect)
"反作用",指函數內部與外部互動(如修改全局變量的值),產生運算之外的其餘結果
函數式編程強調沒有"反作用",意味着函數要保持獨立,全部功能就是返回一個新的值,沒有其餘行爲,尤爲是不得修改外部變量的值。
4. 不可變狀態
函數式編程只是返回新的值,不修改系統變量。所以,不修改變量,也是它的一個重要特色。
在其餘類型的語言中,變量每每用來保存「狀態」。不修改變量,意味着狀態不能保存在遍歷中。函數式編程使用參數保存狀態