const pipe = (...fns) => x => fns.reduce((y, f) => f(y), x);
複製代碼
一行代碼中信息量是很是豐富的,能夠從如下幾個方面來分析數組
...
是ES6標準中的數組擴展運算符bash
擴展運算符能夠展開數組: Math.max(...[1,2,3])
等價於 Math.max(1,2,3)
函數
同時與解構賦值結合起來,用於生成數組,上述代碼示例中就是使用該方法,具體例子: [...fns] = [1,2,3]
則fns=[1,2,3]
ui
let [a,b,c] = [1,2,3]
柯里化函數是一種由須要接受多個參數的函數轉化爲一次只接受一個參數的函數:若是一個函數須要3個參數,那柯里化後的函數會接受一個參數並返回一個函數來接受下一個函數,這個函數返回的函數去傳入第三個參數,最後一個函數會應用了全部參數的函數結果。this
將上述代碼示例轉換一下形式:spa
const pipe = function(x, ...fns) {
fns.reduce((y, f) => f(y), x);
}
複製代碼
爲了看到pipe函數的實際做用,進一步將上述函數進行拆解,用最簡單的語法表示,以更清楚窺探其內部原理prototype
function pipe(x, ...fns){
let total = x;
for(let f in fns){
total = f(total)
}
return total;
}
複製代碼
當咱們調用pipe(x, f1, f2)
時,返回f2(f1(x))rest
代碼示例code
const pipe = (...fns) => x => fns.reduce((y, f) => f(y), x);
const f1 = x => {
return x+1;
}
const f2 = x => {
return 2 * x;
}
// (1+1)*2 = 4
let result = pipe(f1, f2)(1);
console.log(result);
複製代碼