函数柯里化
柯里化可以理解为:只传递给函数一部分参数来调用它,让它返回一个函数去接着处理剩下的参数。比如下面这个简单的例子:
// 实现一个add方法,满足如下需求
// console.log(add(2, 5).valueOf()); // 7
// console.log(add(2)(5).valueOf()); // 7
// console.log(add()(2, 5).valueOf()); // 7
// console.log(add()(2)(5).valueOf()); // 7
function add(...args1) {
let args = args1;
let _add = function (...args2) {
args = args.concat(args2);
return _add;
};
_add.valueOf = function () {
let result = args.reduce((pre, cur) => {
return cur + pre;
}, 0);
return result;
};
return _add;
}
一般函数都是有固定参数数量的,我们可以实现一个通用的工具函数将其柯里化
function currying(fn) {
let _args = [],
max = fn.length;
const closure = function (...args) {
_args.push(...args);
if (_args.length < max) {
return closure;
}
return fn(..._args);
};
return closure;
}
function add(x, y, z) {
return x + y + z;
}
const curryAdd = currying(add);
curryAdd(1, 2)(3); // 6