函数柯里化是将多参数函数转换为一系列单参数函数的过程,每次只传一个参数,未传完则返回新函数;核心是用闭包收集参数并按fn.length判断是否执行。

函数柯里化(Currying)是把一个接收多个参数的函数,转换成一系列只接收一个参数的函数,并返回下一个函数,直到所有参数都传入完毕才执行原函数。核心在于“每次只传一个,没传完就继续返回函数”。
基础实现:手动写一个通用柯里化函数
关键思路是:收集参数,参数够了就执行原函数,不够就返回新函数继续接收。
- 用闭包保存已传入的参数(args)
- 返回的新函数接收新参数,合并后判断是否达到原函数期望的参数个数(fn.length)
- 够了就调用 fn(...args),不够就递归返回自身
示例:
function curry(fn) {
return function curried(...newArgs) {
const args = [...arguments[0] || [], ...newArgs];
if (args.length >= fn.length) {
return fn(...args);
}
return curried.bind(null, args);
};
}
<p>// 使用
const add = (a, b, c) => a + b + c;
const curriedAdd = curry(add);
console.log(curriedAdd(1)(2)(3)); // 6
console.log(curriedAdd(1, 2)(3)); // 6
console.log(curriedAdd(1)(2, 3)); // 6</p>更实用的写法:支持占位符和灵活调用
真实项目中常需支持占位符(如 _),允许跳过某些参数稍后补全。
你接手一个需求时,是不是经常这样:"改一个小字段 → 结果把不相关的代码也改了"、"需求说得很模糊 → 做着做着发现跑偏了"、"数据库加个字段 → 上线才发现漏了数据兼容"、"做了个新功能 → 一个月后自己都忘了当时怎么设计的"、"写到一半被中断 → 再回来不知道从哪继续";这个 Skill 就是专门解决这些问题的。 它会自动探测你的项目环境(JDK、Spring Boot、ORM、数据库、前端框架),记在
- 定义一个占位符常量(比如 curry.placeholder = Symbol())
- 合并参数时,遇到占位符不覆盖,而是预留位置
- 只有当实际参数数量 ≥ 原函数形参个数且无占位符剩余时才执行
这样就能写出像 Lodash 的 _.curry 那样健壮的版本。
ES6 简洁版(适合固定参数个数)
如果只是临时处理已知参数数量的函数,可直接手写链式形式,清晰易读:
const add = a => b => c => a + b + c; console.log(add(1)(2)(3)); // 6 <p>// 或带默认行为 const multiply = x => y => x * y; const double = multiply(2); // 固定第一个参数 console.log(double(5)); // 10</p>
注意点:length 只看形参,不包含 rest 参数
fn.length 返回的是函数定义时的**非默认、非 rest 形参个数**。例如:
- (a, b, c) => {} → length 是 3
- (a, b = 1, ...rest) => {} → length 是 2(忽略默认值和 rest)
所以柯里化函数对含默认值或 rest 参数的函数可能预估不准,建议明确传入期望的参数数量(如 curry(fn, 3))。
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南










