curry概念: 只传递给函数一部分参数来调用它,让它返回一个函数去处理剩下的参数。
你可以一次性地调用curry函数,也可以每次只传一个参数分多次调用。
var add = function(x) {
return function(y) {
return x + y;
};
};
var increment = add(1);
var addTen = add(10);
increment(2);
// 3
addTen(2);
// 12
面试有可能会遇到类似add(2)(3)(4, 5) = 14这种问题,其实就应用了柯里化
我们来实现一版最简单的:
var curry = function(fn) {
var args = [].slice.call(arguments, 1);
return function() {
return fn.apply(this, args.concat([].slice.call(arguments)));
}
}
我们可以这样使用:
function add(a, b) {
return a + b;
}
// 用法1
var addCurry = curry(add, 1, 2);
addCurry(); // 3
// 用法2
var addCurry = curry(add, 1);
addCurry(2); // 3
// 用法3
var addCurry = curry(add);
addCurry(1, 2) // 3
但这种还是不能解决add(2)(3)(4, 5) = 14
我们继续实现一版:
var curry = function(fn, args) {
var length = fn.length, // 获取形参个数
args = args || [];
return function() {
var newArgs = args.slice(0).concat([].slice.call(arguments));
// 判断实参参数个数是否大于或等于形参个数
if(newArgs.length >= length) {
return fn.apply(this, newArgs);
}else {
return curry.call(this, fn, newArgs);
}
}
}
下面就可以利用这个函数解决add(2)(3)(4, 5)的问题了:
相关系列文章:
js函数式编程之偏应用函数 (Partial Application)
参考资料: JS 函数式编程指南