柯里化是将多参数函数转换为接收单个参数并返回新函数的技术,通过闭包逐步收集参数,参数数量满足原函数要求时执行,否则继续返回接收参数的函数。

Currying(柯里化)是把接受多个参数的函数变换成接受单个参数、返回接受余下参数的新函数的技术。它不是简单“拆参数”,而是通过闭包逐步收集参数,最终执行原函数。
核心实现逻辑
柯里化函数接收原始函数,返回一个能逐个接收参数的函数。当累积参数数量达到原函数要求时,自动执行;否则返回继续接收参数的新函数。
- 用 闭包 保存已传入的参数
- 用 arguments.length 或 func.length 判断是否凑够参数
- 用 Array.prototype.concat 合并历史参数与新参数
- 用 apply 或 call 在参数齐备时调用原函数
基础手动实现(支持固定参数个数)
以加法函数为例,原函数 add(a, b, c) 可柯里化为 add(1)(2)(3):
Java项目代码review工具。分析Git变更+完整调用链路上下文,推断业务需求,进行多维度评分和分类汇总,生成完整PRD文档。包含细粒度Java代码审查清单(Null安全、异常处理、Streams、并发、equals/hashCode、资源管理、API设计、性能、MyBatis/ORM、事务边界、SQL/DD...
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));
};
}
};
}
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
更健壮的通用版本(支持不定长调用)
上面版本在部分调用后仍可补全参数,但实际中常需支持“随时执行”——只要参数够就运行,不够就继续等:
function curry(fn) {
return function $curried(...args) {
if (args.length >= fn.length) {
return fn.call(this, ...args);
}
return (...rest) => $curried(...args, ...rest);
};
}
这个版本更贴近 Lodash 的 _.curry 行为:支持任意分段传参,且不依赖 fn.length(对箭头函数或 rest 参数更友好时需额外处理)。
实际使用注意点
柯里化不是万能工具,用前需确认场景合适:
-
适合预设部分参数:如
const sendToUser = curry(api.send)(token),后续只传用户和消息 -
慎用于动态参数函数:含
...rest的函数,fn.length返回 0,需改用标记或手动指定参数数 -
避免过度嵌套:三层以上柯里化会降低可读性,建议搭配命名中间函数,例如
const add5 = add(5) -
this 绑定需留意:若原函数依赖 this,调用时应确保上下文正确,可用
bind或显式传入
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南










