柯里化函数是将多参数函数转换为一系列单参数函数的过程,通过闭包“记住”已传参数,待参数数量达原函数形参个数(fn.length)时执行;支持累积传参、this绑定及实际工程应用。

柯里化函数的核心是把一个接收多个参数的函数,转换成一系列每次只接收一个参数的函数。关键在于“记住”前面传入的参数,等所有参数齐备后再执行原函数。
基础实现:固定参数个数
最常见的方式是预先知道原函数需要几个参数,比如 3 个:
- 用闭包保存已传入的参数(用数组或 arguments)
- 每次调用返回新函数,直到参数数量达到目标才真正执行
- 利用 Function.length 获取原函数期望的参数个数(形参个数)
function curry(fn) {
const arity = fn.length; // 获取期望参数个数
return function curried(...args) {
if (args.length >= arity) {
return fn.apply(this, args);
}
return function(...nextArgs) {
return curried.apply(this, args.concat(nextArgs));
};
};
}
这样 curry(Math.pow)(2)(3) 就能返回 8,因为 Math.pow 有两个形参。
支持不定参数和立即执行
实际中常希望支持“传够就执行,不够就继续等”,且允许中间传多个参数(不止一个):
立即学习“Java免费学习笔记(深入)”;
- 不强制每次只传一个,而是累积参数直到满足条件
- 可手动触发执行(如调用
()或传入undefined等占位符) - 更实用的做法是:当累积参数 ≥ 原函数形参个数时自动执行
function curry(fn) {
return function curried(...args) {
if (args.length >= fn.length) {
return fn.apply(this, args);
}
return (...more) => curried.apply(this, args.concat(more));
};
}
它支持 curry(add)(1, 2)(3) 或 curry(add)(1)(2, 3),只要累计够数就运行。
绑定 this 和支持柯里化后的方法调用
如果原函数依赖 this(比如对象方法),需确保调用时上下文正确:
- 在内部函数中用
fn.call(this, ...args)而非fn(...args) - 避免箭头函数破坏
this绑定(上面例子中用了普通函数声明) - 也可通过
bind预绑定上下文,但通常由使用者自行处理更灵活
使用场景与注意事项
柯里化不是为炫技,而是解决特定问题:
- 预设部分参数,生成专用函数(如
const add5 = curry(add)(5)) - 配合函数式编程工具链(如 Ramda、Lodash 的
curry)做数据流处理 - 注意:箭头函数没有
arguments和length,不能直接柯里化;需先转为普通函数 - 递归深度过深可能影响性能,简单场景直接写闭包更清晰


















