柯里化是通过闭包将多参数函数拆分为单参数函数链,固化部分参数并延迟执行,实现逻辑复用与配置分离;其核心依赖闭包保存中间参数,适用于api封装、校验器构造等“配置+执行”场景。

柯里化不是为了炫技,而是用闭包把“变的”和“不变的” cleanly 分开——让通用逻辑真正可复用、可配置、可组合。
柯里化本质是参数固化 + 延迟执行
它把一个需要多个参数的函数,拆成一串只收一个参数的函数。每次传入一个参数,就固定住它,靠闭包记住;等所有参数齐了,才真正调用原函数。比如:
-
普通写法:
formatDate(date, format, locale)—— 每次都要重复传 locale -
柯里化后:
const zhCNDate = formatDate('zh-CN'); const shortCN = zhCNDate('YYYY-MM-DD');—— locale 提前固化,后续只需关心 date 和 format
闭包是柯里化的基础设施
没有闭包,柯里化就无法保存已传参数。每一次返回的新函数,都带着上一轮传入的参数“记忆”。这些参数不是存在变量里,而是被闭包自然捕获、安全隔离:
- 每个中间函数都形成独立作用域,互不干扰
- 已传参数不会被 GC 回收,直到最终调用完成
- 不同调用链(如
add(1)和add(2))各自维护自己的闭包环境
适合柯里化的典型场景
不是所有多参函数都值得柯里化。真正受益的,是那些有明显“配置项 + 执行项”分离结构的逻辑:
- API 封装:固定 base URL 或 token,生成专用请求函数
- 校验器构造:先定规则(如最小长度),再传待校验值
- 事件处理器预设:提前绑定 id 或上下文,避免在回调里写匿名函数嵌套
-
组件 props 抽象:如
withTheme(theme)(Component),主题复用更清晰
手动实现要注意的关键点
写一个健壮的柯里化工具,得盯住三件事:
- 用
fn.length获取期望参数个数,作为“收齐信号” - 用 rest 参数(
...args)收集当前调用的实参,和闭包中已存参数合并 - 参数够了就直接执行,不够就返回新函数——不要硬编码参数数量,保持通用性











