You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

JS剩余运算符版通用柯里化函数的args参数累加原理疑问

剩余参数版柯里化的参数累加逻辑

核心是Function.prototype.bind()的内置参数拼接特性,剩余运算符只是负责将传入的参数序列转为数组,本身不负责参数累加:

核心逻辑说明

当调用func.bind(thisArg, ...preArgs)返回新函数时,bind会将你传入的preArgs作为预置参数存储;后续调用该新函数时,新传入的参数会自动拼接在预置参数的末尾,共同作为原函数func的入参。
这个自动拼接的行为,就等价于你第二个版本中手动执行[].concat(args, a)的逻辑,只是浏览器内核在bind实现层面替你完成了参数合并,所以你看不到显式的数组操作代码。

对应代码执行过程拆解

我们以addCurried(1)(2)(3)的调用链路逐段分析:

  1. 首次调用addCurried(1):
    • curried的剩余参数args接收值为[1],长度1 < 原函数add的参数长度3
    • 执行curried.bind(null, 1)返回新函数f1,f1内部预置了参数[1]
  2. 调用f1(2):
    • bind自动将预置参数[1]和新传入的2拼接,传入curried
    • 此时args接收值为[1,2],长度2 < 3,继续执行curried.bind(null, 1,2)返回新函数f2,f2预置参数[1,2]
  3. 调用f2(3):
    • bind自动将预置参数[1,2]和新传入的3拼接,传入curried
    • 此时args接收值为[1,2,3],长度等于3,直接调用add返回计算结果6

你可以用下面的极简代码验证bind的参数拼接特性:

function printArgs(...args) {
  console.log(args)
}
// 预置前两个参数
const boundPrint = printArgs.bind(null, 1, 2)
// 调用时传入第三个参数
boundPrint(3) // 输出 [1,2,3],参数拼接由bind自动完成

内容的提问来源于stack exchange,提问作者Arto Avag

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.30 02:30:02