手写函数柯里化
/**
* 函数柯里化
* @param {Function} func 待柯里化的原函数
* @param {Number} arity 所需参数的个数
* @param {Array} args 已接收的参数列表
*/
function curry(func, arity, ...args) {
arity = arity || func.length;
return function (...bindArgs) {
const payload = [...args, ...bindArgs];
if (payload.length < arity) {
return curry.call(this, func, arity, ...payload);
} else {
return func.apply(this, payload);
}
};
}
应用实例
实现一个 function sum 达到以下目的:
sum(1, 2, 3, 4, 5).valueOf(); // 15
sum(1, 2, 3, 4)(5).valueOf(); // 15
sum(1, 2, 3)(4)(5).valueOf(); // 15
sum(1, 2)(3)(4)(5).valueOf(); // 15
sum(1, 2)(3, 4)(5).valueOf(); // 15
实现:
function sum() {
// 缓存参数
const args = Array.from(arguments);
function fn(...bindArgs) {
Array.prototype.push.apply(args, bindArgs);
return fn;
}
// 静态方法,用于计算
fn.valueOf = () => args.reduce((prev, curr) => prev + curr);
// 用于连续调用
return fn;
}
console.log(sum(1, 2, 3, 4, 5).valueOf());
console.log(sum(1, 2, 3, 4)(5).valueOf());
console.log(sum(1, 2, 3, 4)(5).valueOf());
console.log(sum(1, 2)(3)(4)(5).valueOf());
console.log(sum(1, 2)(3, 4)(5).valueOf());