先概念脑补一下:
是把接受多个参数的函数变换成接受一个单一参数(最初函数的第一个参数)的函数,并且返回接受余下的参数而且返回结果的新函数的技术。
柯里化通常也称部分求值,其含义是给函数分步传递参数,每次传递参数后,部分应用参数,并返回一个更具体的函数接受剩下的参数,中间可嵌套多层这样的接受部分参数函数,逐步缩小函数的适用范围,逐步求解,直至返回最后结果。
使用场景
1.固定不变的参数,实现参数复用 2.延迟执行,同样 bind 和箭头函数也能实现同样的功能。
举个简单例子
var foo = function(a) {
return function(b) {
return a * a + b * b;
}
}
调用上述函数foo(3)(4)
举个我觉得复杂的例子- -
function add() {
var _args = [];
return function(){
if(arguments.length === 0) {
return _args.reduce(function(a,b) {
return a + b;
});
}
[].push.apply(_args, [].slice.call(arguments));
/*备忘录,老忘记apply和call区别,记住了吗?!!
简单记录如下
xxx.say.call(test,"1","2");
xxx.say.apply(test,["1","2"]);
*/
return arguments.callee;
//callee 是 arguments 对象的一个属性。可用于引用该函数的函数体内当前正在执行的函数。
}
}
var sum = add();
sum(2)(3)(4)(5)(); //14
一个通用的柯里化函数,自己琢磨一下
var curring = function(fn){
var _args = [];
return function cb(){
if(arguments.length === 0) {
return fn.apply(this, _args);
}
Array.prototype.push.apply(_args, [].slice.call(arguments));
return cb;
}
}
var multi = function(){
var total = 0;
var argsArray = Array.prototype.slice.call(arguments);
argsArray.forEach(function(item){
total += item;
})
return total
};
var calc = curring(multi);
calc(1,2)(3)(4,5,6);
console.log(calc());
柯里化函数的作用
1.提高通用性 2 延迟执行 柯里化的另一个应用场景是延迟执行。不断的柯里化,累积传入的参数,最后执行。