'柯里化Currying'一個聽起來很高大上的名詞,實際上其實就是高階函數的一個特殊用法。javascript
百科:在計算機科學中,柯里化(Currying)是把接受多個參數的函數變換成接受一個單一參數(最初函數的第一個參數)的函數,而且返回接受餘下的參數且返回結果的新函數的技術。這個技術由 Christopher Strachey 以邏輯學家 Haskell Curry 命名的,儘管它是 Moses Schnfinkel 和 Gottlob Frege 發明的。
簡單示例:java
// 普通的add函數
function add(x, y) {
return x + y
}
add(1, 2) // 3
// 柯里化的add函數
function add(x) {
return function (y) {
return x + y
}
}
add(1)(2) // 3複製代碼
實際上就是把add函數的x,y兩個參數,變成了先接收x參數,而後返回一個處理y參數的函數。
數組
只傳遞給函數一部分參數來調用它,讓它返回一個函數去處理剩下的參數。bash
經典示例:閉包
// 實現一個add方法,使計算結果可以知足以下預期:
add(1)(2)(3) = 6;
add(1, 2, 3)(4) = 10;
add(1)(2)(3)(4)(5) = 15;
function add() {
// 第一次執行時,定義一個數組專門用來存儲全部的參數
var _args = Array.prototype.slice.call(arguments);
// 在內部聲明一個函數,利用閉包的特性保存_args並收集全部的參數值
var _adder = function() {
_args.push(...arguments);
return _adder;
};
// 利用toString隱式轉換的特性,當最後執行時隱式轉換,並計算最終的值返回
_adder.toString = function () {
return _args.reduce(function (a, b) {
return a + b;
});
}
return _adder;
}
add(1)(2)(3) // 6
add(1, 2, 3)(4) // 10
add(1)(2)(3)(4)(5) // 15
add(2, 6)(1) // 9複製代碼
參考:函數