JS函數柯里化(curry)
函數柯里化,就是把一個多參數的函數,轉化爲單參數函數。
也就是說: 參數項可以分多次傳遞,直到參數滿足條件,函數執行
function add(x, y) {
return x + y;
}
add(1, 2) // 3
// 柯里化
function addX(y) {
return function (x) {
return x + y;
};
}
addX(1)(2) // 3
柯力化應用
可以達到參數複用的效果
function check(reg, txt) {
return reg.test(txt)
}
// 每次需要傳遞正則, 不太方便
check(/\d+/g, 'test') //false
check(/[a-z]+/g, 'test') //true
// Currying後
function curryCheck(reg) {
return function(txt) {
return reg.test(txt)
}
}
var hasNumber = curryCheck(/\d+/g)
var hasLetter = curryCheck(/[a-z]+/g)
hasNumber('test1') // true
hasLetter('testtest') // true
如果要實現一個遞歸性質的
function curry (fn, args) {
var limit = fn.length; // 被柯里化函數 的參數量
args = args || []; // 原始參數,沒有傳空數組
return function () {
// 獲取函數調用時傳遞的參數
var _args = Array.prototype.slice.call(arguments);
args = args.concat(_args); // 合併參數
if (args.length < limit) { // 如果參數長度未達到,再次返回一個函數
return curry(fn, args)
}
return fn.apply(null, args) // 參數滿足,執行結果
}
}
var curryAdd = curry(add);
curryAdd(3)(2); //5
參考:
https://www.jianshu.com/p/2975c25e4d71