使用bind实现curry函数时参数无法正确注入,调用提示非函数错误
问题原因
你实现的curryByBind仅做了单次参数绑定,没有对绑定后生成的新函数继续做柯里化处理,完整执行逻辑如下:
- 初始调用
curryByBind(sum)时,sum.length为2,返回函数(arg) => sum.bind(null, arg) - 执行
sumMany(1)时,传入参数1得到绑定了第一个参数的sum函数,该函数剩余待接收参数为1个 - 执行
sumMany(1)(2)时,会直接调用绑定了第一个参数的sum函数,传入2后直接返回运算结果3,而非返回新的函数 - 此时你尝试对数字
3执行()调用,自然抛出sumMany(...)(...) is not a function的错误
修复方案
需要对每次参数绑定后生成的新函数,递归传入curryByBind做持续柯里化处理,修改后代码如下:
const curryByBind = (fn) => { // 待接收参数长度为0时执行原函数返回结果 if (fn.length === 0) return fn() // 接收单个参数绑定后,将新生成的函数继续做柯里化处理 return (arg) => curryByBind(fn.bind(null, arg)) } const sum = (x, y) => x + y const sumMany = curryByBind(sum) console.log(sumMany(1)(2)()) // 正常输出 3
内容的提问来源于stack exchange,提问作者Isaac
相关产品推荐
相关产品推荐

