JS剩余运算符版通用柯里化函数的args参数累加原理疑问
剩余参数版柯里化的参数累加逻辑
核心是Function.prototype.bind()的内置参数拼接特性,剩余运算符只是负责将传入的参数序列转为数组,本身不负责参数累加:
核心逻辑说明
当调用func.bind(thisArg, ...preArgs)返回新函数时,bind会将你传入的preArgs作为预置参数存储;后续调用该新函数时,新传入的参数会自动拼接在预置参数的末尾,共同作为原函数func的入参。
这个自动拼接的行为,就等价于你第二个版本中手动执行[].concat(args, a)的逻辑,只是浏览器内核在bind实现层面替你完成了参数合并,所以你看不到显式的数组操作代码。
对应代码执行过程拆解
我们以addCurried(1)(2)(3)的调用链路逐段分析:
- 首次调用
addCurried(1):curried的剩余参数args接收值为[1],长度1 < 原函数add的参数长度3- 执行
curried.bind(null, 1)返回新函数f1,f1内部预置了参数[1]
- 调用f1(2):
bind自动将预置参数[1]和新传入的2拼接,传入curried- 此时
args接收值为[1,2],长度2 < 3,继续执行curried.bind(null, 1,2)返回新函数f2,f2预置参数[1,2]
- 调用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
相关产品推荐
相关产品推荐

