柯里化是通过返回函数实现多参数分步调用的高阶函数技术,核心在于参数固化、延迟执行与上下文绑定,支持自动参数收集、this固化及接口兼容性封装。

柯里化本身就是高阶函数的一种典型实现方式,它通过返回函数来简化参数传递过程,而不是直接执行原逻辑。核心不在于“简化参数个数”,而在于把多参数的一次性调用,拆成单参数的分步调用,让每个中间函数都成为可复用、可预置、可延迟执行的新函数。
用闭包固定前置参数
最直接的简化方式:把原函数的部分参数提前“锁住”,生成一个新函数,只等剩下参数。
- 比如 formatDate(format) 返回一个只接收 date 的函数,format 就被固化了
- 再如 getUser(apiUrl) 返回一个只接收 userId 的函数,避免每次重复传 URL
- 这种写法不需要知道原函数总共有几个参数,只要明确哪些是稳定值,就可提前绑定
自动适配参数数量(通用 currying)
更进一步的简化,是让一个通用柯里化工具能自动识别目标函数的形参个数,并按需收集、直到凑齐才执行。
- 利用 fn.length 获取原始函数期望的参数数量
- 每次调用只收一个或多个参数,内部用数组暂存,未满时不执行,只返回自身
- 当累计参数数 ≥ fn.length 时,用 fn.apply() 执行并返回结果
- 这样写一次 curry(add),就能支持 add(1)(2)、add(1,2)(3)、add(1)(2)(3)(4) 等多种调用风格
结合 this 绑定与上下文复用
柯里化还能把函数执行环境(this)一并固化,让简化后的函数在任意地方调用都不丢失上下文。
立即学习“Java免费学习笔记(深入)”;
- 例如 curry(fn, obj) 返回的函数,内部始终以 obj 为 this 调用 fn
- 比 bind() 更灵活:bind 之后无法再柯里化,而手动 curry 可同时处理 this 和参数分步
- 适合封装 DOM 方法、类实例方法等依赖上下文的场景
在事件处理中隐式简化参数结构
真实项目里,柯里化常用来抹平接口差异,让调用方不用关心底层判断逻辑。
- 比如兼容 addEventListener 和 attachEvent 的 addEvent(type, el, fn)
- 柯里化后写成 const onClick = addEvent('click'),后续只需 onClick(btn, handler)
- 甚至进一步柯里化为 const onBtnClick = addEvent('click')(btn),最后只传 handler 即可
- 调用链越往后,参数越少,语义越清晰,也越接近业务意图


















