隨着對js的深刻,有一種編程思想愈加重要,那就是 函數式編程思想。javascript
函數式編程思想就是 將複雜的函數轉變成爲簡單的函數。經過嵌套的函數調用來實現這一過程java
函數式編程一般有一下幾個特色:es6
1. 函數是 「第一等公民」:函數如其餘數據類型同樣,能夠賦值,能夠做爲參數和返回值編程
2.函數有明確的輸入和輸出:至關於高中數學中的映射,對於相同的輸入,只會返回相同的輸出數組
3.函數無反作用:不會對dom進行操做,不會修改全局變量緩存
4.無外部影響:函數的運行不依賴外部的變量,只會受入參的影響。dom
函數式編程的的核心:函數式編程
1.純函數函數
相同的輸入只會獲得相同的輸出,無反作用,無外部依賴性能
Array對象方法中的 slice 和 splice,slice是不改變原數組,而splice會修改原數組,因此不純潔
2.函數柯里化
將一個多參數的函數轉爲單個參數的函數稱爲函數的柯里化,柯里化以後的函數稱爲柯里化函數。
var add=function(x,y){//普通函數 return x+y } add(1,2)//3
var add=function(x){//柯里化函數 return function(y){ return x+y } }
let add=x=>y=>x+y//es6的寫法,是否是很簡潔 add(1)(2)//3
柯里化函數相比於不一樣函數更加高效,簡潔。
柯里化函數因爲只有一個參數,在運行時會讀取緩存,於是能夠提升性能
3.函數組合
函數組合顧名思義就是把多個函數組合在一塊兒
//兩個函數的組合 var compose = function(f, g) { return function(x) { return f(g(x)); }; }; //或者 var compose = (f, g) => (x => f(g(x))); var add1 = x => x + 1; var mul5 = x => x * 5; compose(mul5, add1)(2); // =>15
4.Point Free
pointfree 模式指的是,永遠沒必要說出你的數據。它的意思是說,函數無須說起將要操做的數據是什麼樣的。純函數、函數柯里化以及函數
// 非 pointfree,由於提到了數據:word var snakeCase = function (word) { return word.toLowerCase().replace(/\s+/ig, '_'); }; // pointfree var snakeCase = compose(replace(/\s+/ig, '_'), toLowerCase);
組合協做起來很是有助於實現這種模式。