js curry实现
柯里化(Currying)的概念
柯里化是一种将多参数函数转换为一系列单参数函数的技术。例如,一个接受三个参数的函数 f(a, b, c) 柯里化后会变为 f(a)(b)(c)。柯里化的核心是延迟执行,逐步传递参数。
实现基础柯里化
以下是一个简单的柯里化实现,支持固定参数数量的函数:
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 sum(a, b, c) {
return a + b + c;
}
const curriedSum = curry(sum);
console.log(curriedSum(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 = '_';
示例用法:
```javascript
function sum(a, b, c) {
return a + b + c;
}
const curriedSum = curryWithPlaceholder(sum);
console.log(curriedSum('_', 2)(1, 3)); // 输出 6(跳过第一个参数,后续补充)
无限参数柯里化
若需支持不固定参数数量的柯里化(如累加),需明确终止条件(如无参数调用):
function infiniteCurry(fn) {
return function curried(...args) {
if (args.length === 0) {
return fn();
} else {
return function(...nextArgs) {
if (nextArgs.length === 0) {
return fn(...args);
} else {
return curried(...args, ...nextArgs);
}
};
}
};
}
示例用法:

const add = infiniteCurry((...nums) => nums.reduce((a, b) => a + b, 0));
console.log(add(1)(2)(3)()); // 输出 6(通过空调用终止)
注意事项
- 参数长度检查:基础柯里化依赖
fn.length,因此不适用于可变参数函数(如(...args) => ...)。 - 性能:每次柯里化调用会生成新函数,可能带来轻微性能开销。
- 上下文:使用
apply确保函数调用时的this正确绑定。






