柯里化函数实现无限累加的核心是闭包保存状态并重写tostring/valueof触发隐式转换求和。每次调用返回新函数更新内部sum,最终在字符串或数值上下文中自动调用对应方法返回结果。

柯里化函数实现无限累加,核心是靠闭包保存中间状态,再配合函数重写 toString 或 valueOf 方法,在隐式类型转换时触发求和。它不是靠“一直传参不停止”,而是靠“每次调用返回新函数 + 最终取值触发计算”。
闭包保存累加状态
外层函数定义一个私有变量(如 sum),内层返回的函数持续访问并更新它。这个变量不会被回收,生命周期被延长——这就是闭包在起作用。
- 每次调用都只是更新内部 sum,不立即计算
- 返回的仍是同一个函数引用,保证链式调用连续性
- 没有全局变量,状态完全封装在作用域内
利用 toString/valueOf 触发最终结果
JavaScript 在需要字符串或数值上下文(比如 console.log、+ ''、==)时,会自动调用对象的 toString 或 valueOf。重写它们,就能让函数“看起来像值”。
- console.log(add(1)(2)(3)) → 触发 toString
- +add(1)(2)(3) → 触发 valueOf
- 两者都返回当前累加值,实现“隐形求和”
典型实现代码(简洁可运行)
下面这段代码能支持 add(1)(2)(3),也能接更多括号:
function add(x) {
let sum = x;
function inner(y) {
sum += y;
return inner;
}
inner.toString = () => sum;
inner.valueOf = () => sum;
return inner;
}
- 调用 add(1)(2)(3) 时,inner 不断返回自身
- 最后一步 console.log 或参与运算,触发 toString/valueOf
- 输出结果为 6,而非函数本身
闭包的其他常见应用场景
除了无限累加,闭包在实际开发中还广泛用于:
- 模块私有变量:模拟“private”字段,避免污染全局或暴露内部逻辑
- 事件回调中的稳定引用:循环绑定 click 时,用闭包捕获当前索引或数据
- 防抖/节流函数封装:保存定时器 ID,确保每次清除的是上一次的定时器
- 柯里化通用工具:预设部分参数,生成定制化函数(如 isNumber = checkType('Number'))
- 迭代器或生成器封装:保存当前状态(如计数器、游标位置)











