柯里化是将接收多个参数的函数转换为一系列只接收一个参数的函数的过程;每次调用返回新函数,直至参数集齐才执行原逻辑,核心通过闭包保存参数、fn.length判断数量、apply处理this与参数合并。

什么是柯里化(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));
};
}
};
}
用法演示:从 add(1,2,3) 变成 add(1)(2)(3)
假设原始函数是:
function add(a, b, c) { return a + b + c; }
使用柯里化后:
- add(1)(2)(3) → 6
- add(1,2)(3) → 6(支持部分参数提前传入)
- add(1)(2,3) → 6(也兼容多参数一次传)
注意边界和实用细节
柯里化不是简单“拆成多个箭头函数”,它要动态适配参数数量,所以依赖 fn.length 获取形参个数。但要注意:
- 箭头函数没有 arguments 和 length 的准确表现,建议对普通函数使用
- 若原函数有默认参数或 rest 参数(...args),fn.length 可能不反映实际必填数,需手动指定参数个数
- 想支持 this 绑定,curried 函数中要用 apply(this, ...) 而非忽略上下文
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南











