柯里化定义理解
接受多个参数更改为接受单一参数(函数开始的那个参数),处理剩余参数并返回结果的一种技术。
柯里化作用
- 延迟计算(
javaScript
原生中的bind
同个效果,都是返回一个函数) - 参数复用(通用一个参数传进来)
- 提前返回(执行后返回一个确定的函数,下次调用将直接调用返回的函数)
柯里化的关键点
先看一段代码:
function currying(fn) {
// 如果是传fn的时候就传参数的话,就需要保存下来
var args = Array.prototype.slice.call(arguments, 1);
return function() {
// 将继续传进来的参数,放到args里面保存起来
if (arguments.length > 0) {
[].push.apply(args, arguments);
return arguments.callee;
} else {// 如果不传参了,就回调函数
fn.apply(this, args)
}
}
}
显而易见的,柯里化的核心是闭包以及apply回调。
里面的函数引用了外部变量 args
,那么这个变量就可以用来继续保存 fn
传进来的变量了,也就是 arguments
值。当没有传参的时候,使用 apply
回调 fn
,完成。
let sum = 0;
function add() {
for (let i = arguments.length - 1; i >= 0; i--) {
sum += arguments[i];
}
return sum;
}
var add = currying(add, 100);
add(1)(2)(3)(); // 106