柯里化是闭包在函数式编程中的典型应用,通过捕获已传参数将多参函数转为单参函数链,实现参数复用、延迟执行、函数组合与缓存增强。

柯里化本质上是闭包在函数式编程中的一类典型应用——它依赖闭包“捕获并携带已传参数”的能力,把多参数函数逐步转化为单参数函数链。
参数复用:固定部分输入,生成专用函数
当某组参数长期不变(比如 API 基础 URL、单位换算系数、校验正则),用柯里化可提前固化它们,避免重复传参。闭包让这些“固定值”持续保留在内存中,供后续调用使用。
- 例如:
const validateEmail = curry((reg, str) => reg.test(str))(/^[^\s@]+@[^\s@]+\.[^\s@]+$/);—— 生成一个只接收字符串的邮箱校验函数 - 再如:
const multiplyBy2 = curry((a, b) => a * b)(2);—— 得到multiplyBy2(5)返回10
延迟执行:分步收集参数,触发时机由调用者控制
柯里化函数不立即运算,而是等参数收齐才执行原逻辑。这种“攒够再算”的行为,靠闭包维持中间状态(已传参数列表),非常适合处理异步链、事件回调或配置驱动的流程。
- 常见于 UI 组件封装:如
createButton(theme, size)(text, onClick),前两步定样式,后两步定内容与行为 - 配合 Promise 链时,可写成
fetchData(baseUrl)(path)(headers),每层都返回 Promise,便于组合和复用
函数组合:为管道式调用(pipe/compose)提供统一接口
函数式编程强调小而专的纯函数。柯里化确保所有函数都是一元(单参数),天然适配 compose(f, g, h) 或 pipe(a, b, c) 这类组合工具,闭包在此承担“参数暂存+透传”的桥梁角色。
- 例如:
const toUpperCase = s => s.toUpperCase(); const addPrefix = p => s => p + s; const greet = compose(addPrefix('Hello '), toUpperCase);—— 只有柯里化后的addPrefix才能被compose正确串联 - 未柯里化的
addPrefix('Hello ', str)无法直接参与组合,因为参数数不匹配
缓存增强:结合记忆化(memoization),提升重复调用性能
闭包不仅保存参数,还能配合内部缓存对象,在柯里化链中对最终结果做记忆。尤其适合递归计算(如斐波那契、阶乘)或高开销校验逻辑。
- 实现方式:在柯里化外层函数中声明
const cache = {},每次执行前查缓存,命中则直接返回 - 注意点:缓存键需唯一标识参数组合,常见做法是
JSON.stringify(args)或拼接字符串











