柯里化是将多参数函数转换为每次只接收一个参数、返回新函数、直至所有参数齐备才执行的过程,依赖闭包暂存参数,需通过fn.length判断参数数量并正确绑定this。

柯里化就是把一个要传多个参数的函数,变成每次只收一个参数、返回新函数、直到所有参数齐了才真正执行的过程。它靠闭包记住前面传过的参数,不是简单“少传几个”,而是构建可暂停、可复用的调用链。
基础用法:手动写一个通用 curry 函数
核心是判断已收集参数个数是否达到原函数要求(用 fn.length),够了就执行,不够就返回继续收参的新函数:
- 用 arguments 或剩余参数收集当前调用的值
- 用 Array.prototype.concat 合并历史参数与新参数
- 用 fn.apply(this, args) 正确绑定上下文并传入全部参数
示例实现:
function curry(fn) {
return function curried(...args) {
if (args.length >= fn.length) {
return fn.apply(this, args);
}
return function(...nextArgs) {
return curried.apply(this, args.concat(nextArgs));
};
};
}
实际调用:add(1)(2)(3) 这样写就对了
假设原始函数是 const add = (a, b, c) => a + b + c,柯里化后可以这样分步调用:
在 Java 中初始化和管理阿里云 SDK客户端。包括单例模式、线程安全、endpoint 与 region 配置、VPC 终端节点、同步与异步等。
- curry(add)(1) → 返回等待 b 和 c 的函数
- curry(add)(1)(2) → 返回等待 c 的函数
- curry(add)(1)(2)(3) → 参数齐备,返回 6
也可以中途保存中间函数,比如 const add5 = curry(add)(5),之后 add5(2)(3) 得到 10,这就是参数预置和复用。
注意边界:参数数量和 this 绑定不能忽略
原函数形参个数决定链式深度,fn.length 是关键依据;箭头函数没有自己的 this,所以通用实现中用 function 声明并配合 apply 能确保上下文正确传递。
如果原函数有默认参数或 rest 参数,fn.length 只统计非默认、非 rest 的形参个数,这点在设计时需留意。
和部分应用(partial application)的区别
柯里化强制每次只传一个参数,生成固定长度的链;而部分应用允许一次传多个(如 partial(add, 1, 2) 直接返回 (c) => 1 + 2 + c)。两者都依赖闭包记参,但策略不同——柯里化是“严格单步”,部分应用是“灵活预填”。
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南










