在學習函數(shù)柯里化的時候看到這篇文章https://github.com/yygmind/bl...,作者的一個實現(xiàn)思路是這樣的: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返回的函數(shù)的length已經是length-args.length了",他給出的代碼是:functioncurrying(fn){returnfunction(...args){returnargs.length>=fn.length?fn.apply(this,args):currying(fn.bind(this,...args))}}為什么bind后返回的函數(shù)的形參個數(shù),即length剛好是length-args.length呢?這個length-args.length我的理解是計算還需要多少個參數(shù)才可以實際運算fn,第一次遞歸后,currying的第二個參數(shù)就是這個差值,不再是函數(shù)形參個數(shù),之后拿這個差值與柯里化后的函數(shù)實際接受的參數(shù)數(shù)目比較,如果這個數(shù)目達到了差值,就不需要再遞歸了。而按照這個評論的說法,bind返回的函數(shù)的length就是length-args.length,因此不需要給遞歸的currying傳length-args.length,這是怎么看出來的?bind的第二個參數(shù)會在bind返回的函數(shù)實際執(zhí)行的時候傳遞給它,基于這一點我們才可以收集參數(shù),最后統(tǒng)一運算,但是為什么bind返回的函數(shù)的length就剛好是length-args.length呢?
添加回答
舉報
0/150
提交
取消