柯里化通常也称部分求值,其含义是给函数分步传递参数,每次传递参数后部分应用参数,并返回一个更具体的函数接受剩下的参数,这中间可嵌套多层这样的接受部分参数函数,直至返回最后结果。
柯里化其实本身是固定一个可以预期的参数,并返回一个特定的函数,处理批特定的需求。这增加了函数的适用性,但同时也降低了函数的适用范围。
那么柯里话的好处呢?有以下三个方面:
柯里化有3个常见作用:1. 参数复用;2. 提前返回;3. 延迟计算/运行
通俗的说,就是一个函数接收一个参数,然后在return另一个函数接收另一个参数,如果参数长度任意,则map/reduce或者其他手段循环出来。
例如,一个确定只有两个参数的柯里化
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()中的形参x表示接收到的第一个参数,也就是var increment = add(1)
中的1和 var addTen = add(10)
中的10,increment(2)
与addTen(2)
中的2分别由y接收到。
那么参数长度不确定呢?
var currying = function (fn) {
var _args = [];
return function () {
if (arguments.length === 0) {
return fn.apply(this, _args);
}
Array.prototype.push.apply(_args, [].slice.call(arguments));
return arguments.callee;
}
};
var multi=function () {
var total = 0;
for (var i = 0, c; c = arguments[i++];) {
total += c;
}
return total;
};
var sum = currying(multi);
sum(100,200)(300);
sum(400);
console.log(sum()); // 1000 (空白调用时才真正计算)