Skip to main content

手写函数柯里化

/**
* 函数柯里化
* @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());