为了账号安全,请及时绑定邮箱和手机立即绑定

实现函数柯里化,最后返回柯里化函数的时候为什么不需要额外传参?求大佬指点!

实现函数柯里化,最后返回柯里化函数的时候为什么不需要额外传参?求大佬指点!

红糖糍粑 2019-08-24 23:04:03
在学习函数柯里化的时候看到这篇文章https://github.com/yygmind/bl...,作者的一个实现思路是这样的:functioncurrying(fn,length){length=length||fn.length;//注释1returnfunction(...args){//注释2returnargs.length>=length//注释3?fn.apply(this,args)//注释4:currying(fn.bind(this,...args),length-args.length)//注释5}}//Testconstfn=currying(function(a,b,c){console.log([a,b,c]);});fn("a","b","c")//["a","b","c"]fn("a","b")("c")//["a","b","c"]fn("a")("b")("c")//["a","b","c"]fn("a")("b","c")//["a","b","c"]底下有一个评论说,"可以不用在递归currying的时候传入length-args.length,因为bind返回的函数的length已经是length-args.length了",他给出的代码是:functioncurrying(fn){returnfunction(...args){returnargs.length>=fn.length?fn.apply(this,args):currying(fn.bind(this,...args))}}为什么bind后返回的函数的形参个数,即length刚好是length-args.length呢?这个length-args.length我的理解是计算还需要多少个参数才可以实际运算fn,第一次递归后,currying的第二个参数就是这个差值,不再是函数形参个数,之后拿这个差值与柯里化后的函数实际接受的参数数目比较,如果这个数目达到了差值,就不需要再递归了。而按照这个评论的说法,bind返回的函数的length就是length-args.length,因此不需要给递归的currying传length-args.length,这是怎么看出来的?bind的第二个参数会在bind返回的函数实际执行的时候传递给它,基于这一点我们才可以收集参数,最后统一运算,但是为什么bind返回的函数的length就刚好是length-args.length呢?
查看完整描述

2 回答

?
偶然的你

TA贡献1841条经验 获得超3个赞

function.prototype.bind
bind方法设置了返回的函数对象的length为(输入的)fn.length-args.length
                            
查看完整回答
反对 回复 2019-08-24
?
慕标5832272

TA贡献1966条经验 获得超4个赞

bind的时候args展开的是实参,数量当然就是传入的实参数量。
这种写法只适用于es6,es5以前还是需要第一种写法。(虽然第一种写法也用到了参数展开,但是可以很容易改写成非展开的写法,而第二种则依赖于展开操作的副作用)
                            
查看完整回答
反对 回复 2019-08-24
  • 2 回答
  • 0 关注
  • 303 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信