写一个例子,结合前面的三个特点。参数复用,提前返回,延迟执行。
function curry(fn) {
let __args = [];
return function cb() {
if (arguments.length === 0 ) {
return fn.apply(null, __args);
}
// 这样写既支持传入一个参数,也支持传入多个参数。
Array.prototype.push.apply(__args, [].slice.call(arguments));
return cb;
}
}
let add = function() {
// 把传入的参数转化成数组
let arr = Array.from(arguments);
// 数组求和
let res = arr.reduce((prev, current) => prev + current);
console.log(res);
}
let curryAdd = curry(add);
curryAdd(1)(2)(2,3)(); // 结果输出8