函数柯里化 js实现
函数柯里化的概念
函数柯里化(Currying)是一种将多参数函数转换为一系列单参数函数的技术。通过柯里化,可以将一个接收多个参数的函数分解为多个接收单个参数的函数链式调用。
基础柯里化实现
以下是一个简单的柯里化函数实现,支持固定参数数量的函数:
function curry(fn) {
return function curried(...args) {
if (args.length >= fn.length) {
return fn.apply(this, args);
} else {
return function (...nextArgs) {
return curried.apply(this, args.concat(nextArgs));
};
}
};
}
使用示例:

function add(a, b, c) {
return a + b + c;
}
const curriedAdd = curry(add);
console.log(curriedAdd(1)(2)(3)); // 输出 6
console.log(curriedAdd(1, 2)(3)); // 输出 6
支持占位符的柯里化
通过引入占位符(如 _),可以更灵活地延迟某些参数的传递:
function curryWithPlaceholder(fn) {
return function curried(...args) {
const complete = args.length >= fn.length && !args.includes(curryWithPlaceholder.placeholder);
if (complete) {
return fn.apply(this, args);
} else {
return function (...nextArgs) {
const mergedArgs = args.map(arg =>
arg === curryWithPlaceholder.placeholder && nextArgs.length ? nextArgs.shift() : arg
).concat(nextArgs);
return curried.apply(this, mergedArgs);
};
}
};
}
curryWithPlaceholder.placeholder = '_';
使用示例:

function multiply(a, b, c) {
return a * b * c;
}
const curriedMultiply = curryWithPlaceholder(multiply);
console.log(curriedMultiply('_', 2)(1)(3)); // 输出 6 (1 * 2 * 3)
console.log(curriedMultiply(1, '_', 3)(2)); // 输出 6 (1 * 2 * 3)
无限参数柯里化
对于不固定参数数量的函数(如 sum(...args)),可以通过显式调用空参数结束柯里化:
function infiniteCurry(fn) {
return function curried(...args) {
if (args.length === 0) {
return fn.apply(this, []);
} else {
return function (...nextArgs) {
if (nextArgs.length === 0) {
return fn.apply(this, args);
} else {
return curried.apply(this, args.concat(nextArgs));
}
};
}
};
}
使用示例:
function sum(...nums) {
return nums.reduce((acc, val) => acc + val, 0);
}
const curriedSum = infiniteCurry(sum);
console.log(curriedSum(1)(2)(3)()); // 输出 6
console.log(curriedSum(1, 2)(3, 4)()); // 输出 10
注意事项
- 函数长度(
fn.length):柯里化依赖函数的形参数量,若使用默认参数或剩余参数(如function(a, b = 1)),fn.length可能不准确。 this绑定:需通过apply或call确保原函数的this上下文正确传递。- 性能:频繁柯里化可能产生大量闭包,需权衡场景需求。
以上实现覆盖了基础柯里化、占位符支持和无限参数场景,可根据实际需求选择或扩展。






