柯里化是通过闭包分步接收参数,待累积数量等于原函数形参个数(fn.length)时执行,支持灵活调用如f(1)(2)(3)或f(1,2)(3),本质是“缓收”而非语法拆分,区别于部分应用。

函数柯里化不是“拆”多参函数,而是用闭包把参数分步收进来,等凑够原函数声明的形参个数才执行。关键不在语法切割,而在参数累积和调用时机的控制。
理解柯里化的本质:不是拆,是“缓收”
比如 function sum(a, b, c) { return a + b + c },柯里化后不是把它写成三个独立函数,而是让每次调用只接收一个参数,并返回能继续接收下一个参数的函数:
-
第一次调用:传入
a,返回一个记住a的函数; -
第二次调用:传入
b,返回一个记住a和b的函数; -
第三次调用:传入
c,此时参数数量等于sum.length(即 3),立刻执行原逻辑并返回结果。
手写实现的核心判断依据:fn.length
fn.length 返回函数定义时的形参个数,是判断是否“收齐”的标尺。注意它有局限性:
- 对箭头函数、含默认值或 rest 参数(
...args)的函数,length可能不准确(例如(a, b = 1) => {}的length是 1); - 实际开发中若需兼容这类函数,得配合参数检查或改用其他策略(如显式传入期望参数数);
- 普通具名函数或匿名函数无默认值时,
length是可靠依据。
支持灵活调用:一次传多个也行
好的柯里化实现允许混合调用方式,不只是 f(1)(2)(3),还能支持 f(1, 2)(3) 或 f(1)(2, 3):
- 内部用数组累积所有已传参数(如
args.concat(...arguments)); - 每次调用都检查当前总参数长度是否 ≥
fn.length; - 满足则用
fn.apply(this, args)执行,确保this上下文和参数顺序正确。
别混淆:柯里化 ≠ 部分应用
两者常被混谈,但目标不同:
-
柯里化:强制转为单参数链,
f(a,b,c)→f(a)(b)(c),每层只认一个; -
部分应用:固定任意个参数,返回新函数,
partial(f, 1)→g(b,c),仍可多参调用; - 柯里化函数天然支持部分应用,但部分应用函数不一定是柯里化的。
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南











