在学习函数柯里化的时候看到这篇文章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呢?
陪伴而非守候
catspeake
相关分类