javascript通用柯里化工具核心是依据fn.length递归等待参数,累计达形参个数即执行;基础版用闭包收集参数,增强版用箭头函数保持this绑定,均不支持rest参数动态计数及占位符。

JavaScript 中实现通用的函数柯里化(Currying)工具,核心是让一个接收多个参数的函数,能被逐步传入参数、每次只传一部分,并返回一个新的函数,直到参数数量满足原函数要求才真正执行。
理解柯里化的基本逻辑
柯里化不是简单地“拆参数”,而是基于原函数的 期望参数个数(length) 做递归等待。关键点包括:
- 通过
fn.length获取函数期望的形参个数(注意:不包含 rest 参数) - 每次调用返回新函数,收集已传参数
- 当累计参数数 ≥ 原函数 length 时,立即执行并返回结果
- 支持多次调用、部分调用后继续传参(即“惰性求值”)
基础版实现(支持普通函数)
以下是一个简洁、可读性强的通用柯里化函数:
function curry(fn) {
return function curried(...args) {
if (args.length >= fn.length) {
return fn.apply(this, args);
}
return function(...moreArgs) {
return curried.apply(this, args.concat(moreArgs));
};
};
}
使用示例:
Java项目代码review工具。分析Git变更+完整调用链路上下文,推断业务需求,进行多维度评分和分类汇总,生成完整PRD文档。包含细粒度Java代码审查清单(Null安全、异常处理、Streams、并发、equals/hashCode、资源管理、API设计、性能、MyBatis/ORM、事务边界、SQL/DD...
function add(a, b, c) {
return 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
增强版(支持 this 绑定与 rest 参数兼容)
上述基础版在严格模式或涉及 this 的场景下可能出问题。更健壮的版本应保留调用上下文,并正确处理箭头函数(但注意:箭头函数无 this 和 arguments,也不影响 fn.length):
function curry(fn) {
return function curried(...args) {
return args.length >= fn.length
? fn.apply(this, args)
: (...moreArgs) => curried.apply(this, [...args, ...moreArgs]);
};
}
这个版本用箭头函数避免了内层函数中 this 丢失,且语义更清晰。它适用于绝大多数普通函数,包括方法绑定场景(如 curry(obj.method).call(obj, ...))。
注意事项与边界情况
实际使用中需留意:
-
fn.length只统计非 rest 形参,例如(a, b, ...rest) => {}的 length 是2 - 无法自动识别默认参数是否已提供(ES6 默认参数不影响
length),所以柯里化按“声明形参个数”判断,而非“实际需传几个” - 不支持动态参数个数的函数(如仅靠
arguments判断的旧写法),建议统一用 rest 参数 + 显式长度设计 - 若需支持占位符(如
curry(fn)(1, _, 3)(2)),需额外扩展逻辑,不属于“通用基础柯里化”范畴
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南










