函数柯里化 js实现
函数柯里化的概念
函数柯里化(Currying)是一种将多参数函数转换为一系列单参数函数的技术。通过柯里化,可以将一个接受多个参数的函数分解为多个嵌套的函数,每个函数只接受一个参数并返回一个新函数,直到所有参数收集完毕并返回最终结果。

基础实现方法
function curry(fn) {
return function curried(...args) {
if (args.length >= fn.length) {
return fn.apply(this, args);
} else {
return function(...args2) {
return curried.apply(this, args.concat(args2));
};
}
};
}
说明:

- 检查当前传入的参数数量是否达到原函数的参数长度(
fn.length)。 - 如果满足条件,直接调用原函数并返回结果。
- 否则返回一个新函数,继续收集剩余参数。
使用示例
function sum(a, b, c) {
return a + b + c;
}
const curriedSum = curry(sum);
console.log(curriedSum(1)(2)(3)); // 输出: 6
console.log(curriedSum(1, 2)(3)); // 输出: 6
console.log(curriedSum(1, 2, 3)); // 输出: 6
支持占位符的高级实现
通过占位符(如_)可以灵活指定参数位置:
function curryWithPlaceholder(fn) {
return function curried(...args) {
const complete = args.length >= fn.length && !args.includes(curryWithPlaceholder._);
if (complete) {
return fn.apply(this, args);
} else {
return function(...args2) {
const mergedArgs = args.map(arg =>
arg === curryWithPlaceholder._ && args2.length ? args2.shift() : arg
).concat(args2);
return curried.apply(this, mergedArgs);
};
}
};
}
curryWithPlaceholder._ = Symbol('_'); // 定义占位符
示例:
const curriedSum2 = curryWithPlaceholder(sum);
console.log(curriedSum2(1, curryWithPlaceholder._, 3)(2)); // 输出: 6
注意事项
- 原函数的参数长度(
fn.length)必须明确,箭头函数或无参数默认值的函数可能导致length不准确。 - 占位符实现会增加复杂度,需根据实际需求选择是否使用。






