要实现无限链式调用sum(1)(2)(3)(),核心是通过空参数调用()或隐式toString触发求和,每次调用维护独立闭包累积参数并支持多参数混合传入,确保各链路隔离。

要让函数支持 sum(1)(2)(3)(4)… 这种无限链式调用,核心不是“预设参数个数”,而是设计一种能持续收集参数、并在合适时机触发计算的机制。关键在于:不依赖参数数量判断是否结束,而是靠调用方式或隐式转换来收尾。
用空调用作为终止信号
让每次传参都返回新函数,但当调用时不传任何参数(即 ())时,就执行累加并返回结果。
- 内部维护一个参数数组,每次调用都把新参数 push 进去
- 返回的函数本身可继续接收参数;但若调用时
arguments.length === 0,就不再返回函数,而是执行求和 - 示例:
sum(1)(2)(3)(4)()→ 返回10,sum(1,2)(3)(4,5)()→ 同样返回15
重写 toString 实现隐式取值
利用 JavaScript 对象在需要字符串值时自动调用 toString 的特性,让函数既可继续调用,又能在被读取时返回当前累加结果。
- 闭包中保存累计和,每次调用更新该值
- 返回的函数重写
toString方法,直接返回当前总和 - 这样
sum(1)(2)(3)本身是个函数,但+sum(1)(2)(3)或console.log(sum(1)(2)(3))会触发toString,输出6 - 注意:这种方式不能直接赋值给变量后延迟使用,因为
toString是隐式触发,非显式调用
支持混合传参(单个/多个同时传)
真实场景中用户可能一次传多个数,比如 sum(1,2)(3)(4,5,6),所以柯里化函数需兼容数组展开逻辑。
- 每次接收的
arguments都应扁平化合并到累积参数列表中 - 避免简单拼接嵌套数组,要用
[].concat(...arguments)或展开运算符处理 - 终止条件保持一致:空调用或
toString触发,不因传参方式改变行为
避免常见陷阱
这类实现容易忽略执行上下文与多次调用的隔离问题。
- 每个初始调用(如
sum(1))必须生成独立的参数存储空间,不能共用外部变量,否则不同链路会互相干扰 - 不要在全局或外层作用域缓存参数,而应在每次柯里化入口函数内创建新闭包
- 如果涉及异步或 Promise,需额外处理返回值类型一致性,基础版本建议专注同步累加

















