柯里化是将多参数函数转为单参数函数序列的过程,核心是延迟执行、参数累积和按length检测调用条件;基础版利用闭包保存参数,通过fn.length判断是否执行,增强版支持绑定this和预设参数。

柯里化(Currying)是将一个接收多个参数的函数,转换为一系列只接收单个参数的函数的过程。实现一个通用的、能自动收集不定数量参数的柯里化函数,关键在于:**延迟执行 + 参数累积 + 检测是否满足调用条件**。
核心思路:利用闭包保存已传参数,通过函数的 length 属性判断是否“参数已够”
JavaScript 函数对象有 length 属性,表示其定义时声明的形参个数(不包括 rest 参数)。我们可以以此作为“目标参数数量”,当累计传入的实参数量 ≥ 原函数 length 时,就触发执行。
注意:这个策略适用于普通具名/匿名函数(不含 ...args),对箭头函数或含 rest 参数的函数需额外处理(后文说明)。
基础版:支持普通函数,自动按 length 收集参数
以下是一个简洁可靠的通用 currying 实现:
在 Java 中初始化和管理阿里云 SDK客户端。包括单例模式、线程安全、endpoint 与 region 配置、VPC 终端节点、同步与异步等。
function curry(fn) {
return function curried(...args) {
if (args.length >= fn.length) {
return fn.apply(this, args);
} else {
return function(...moreArgs) {
return curried.apply(this, args.concat(moreArgs));
};
}
};
}使用示例:
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
console.log(curriedAdd(1, 2, 3)); // 6说明:
- 每次调用 curried 都会检查当前所有已传参数(args)是否达到 fn.length
- 未满则返回新函数,把已有参数和后续参数拼接后递归调用自身
- 利用 apply 保持 this 绑定正确(避免箭头函数丢失上下文)
增强版:支持提前绑定 this 和部分参数(类似 bind)
实际中常需固定 this 或预设前几个参数。可扩展 curry 接收可选配置:
function curry(fn, context = null) {
return function curried(...args) {
if (args.length >= fn.length) {
return fn.apply(context, args);
} else {
return function(...moreArgs) {
return curried.apply(context, args.concat(moreArgs));
};
}
};
}
<p>// 使用
const obj = { base: 10 };
function multiply(base, factor) {
return base * factor;
}
const curriedMultiply = curry(multiply, obj);
console.log(curriedMultiply(2)(5)); // 10</p>注意事项与边界情况
需明确几个常见限制和应对方式:
- 箭头函数无 arguments 和 length:无法直接 curry((a,b,c) => a+b+c),应先转为普通函数或手动指定 arity
- rest 参数(...args)会使 fn.length 为 0:此时无法靠 length 判断,需显式传入期望参数个数,如 curry(fn, 3)
- 需要重置/取消累积时:可在返回函数上挂载 reset() 方法(非标准,按需添加)
- 性能敏感场景:频繁嵌套调用存在轻微开销,生产环境可配合 memoize 或 Lodash 的 _.curry
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南










