柯里化本质是用闭包延迟求值:内部函数通过闭包持续保存已传参数,累计达原函数形参个数(fn.length)时才执行;支持分步或批量传参,天然解耦配置与执行,适用于api封装、表单校验等场景。

柯里化本质是用闭包把参数“存起来”,等凑够了再算——不是立刻执行,而是把执行时机交给调用者决定。
闭包怎么记住已传的参数
每次调用柯里化函数时,新参数不会直接触发运算,而是被收集进一个闭包变量(比如数组 args)中。这个变量在内部函数多次调用间持续存在,不随外层函数退出而销毁。
- 内部函数始终能访问到之前所有传入的参数
- 不依赖全局变量,避免命名冲突和状态污染
- 例如 curriedAdd(1) 返回的函数,已经把 1 “焊”在自己的作用域里了
什么时候才真正执行原函数
判断依据是累计参数个数是否达到原函数声明的形参数量(fn.length)。没满就继续返回函数;满了就用全部参数调用原函数。
- 支持一次传多个,比如 curriedAdd(1, 2)(3) 或 curriedAdd(1)(2, 3)
- 也可扩展逻辑:空参数调用(())时强制执行,适配表单提交等场景
- 不硬编码参数个数,自动适配任意多参函数
为什么适合业务中的延迟执行
它天然把“配置”和“运行”分开:前期只设定不变的部分,等用户操作、数据到达或条件满足时,再注入变动参数并触发。
- API 封装:const apiV1 = curry(request)('https://api.example.com/v1'),后续调用自动带基地址
- 表单校验:const checkEmail = email('格式错误'),提交时才传入输入值
- 事件处理:const handleClick = curry(handle)(context),点击时再补 event
参数复用让逻辑更清晰
把重复出现的固定值(如单位、精度、规则、前缀)提前固化,生成专用函数,后续只关注变化部分。
- 金额格式化:const priceCN = pipe(toFixed(2), withUnit('¥')),两个函数都是柯里化的
- 不同业务线共用同一套工具,仅靠初始参数区分行为
- “什么变、什么不变”一目了然,替换规则或调试都更直接











