在學(xué)習(xí)函數(shù)柯里化的時(shí)候看到這篇文章https://github.com/yygmind/bl...,作者的一個(gè)實(shí)現(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"]底下有一個(gè)評論說,"可以不用在遞歸currying的時(shí)候傳入length-args.length,因?yàn)閎ind返回的函數(shù)的length已經(jīng)是length-args.length了",他給出的代碼是:functioncurrying(fn){returnfunction(...args){returnargs.length>=fn.length?fn.apply(this,args):currying(fn.bind(this,...args))}}為什么bind后返回的函數(shù)的形參個(gè)數(shù),即length剛好是length-args.length呢?這個(gè)length-args.length我的理解是計(jì)算還需要多少個(gè)參數(shù)才可以實(shí)際運(yùn)算fn,第一次遞歸后,currying的第二個(gè)參數(shù)就是這個(gè)差值,不再是函數(shù)形參個(gè)數(shù),之后拿這個(gè)差值與柯里化后的函數(shù)實(shí)際接受的參數(shù)數(shù)目比較,如果這個(gè)數(shù)目達(dá)到了差值,就不需要再遞歸了。而按照這個(gè)評論的說法,bind返回的函數(shù)的length就是length-args.length,因此不需要給遞歸的currying傳length-args.length,這是怎么看出來的?bind的第二個(gè)參數(shù)會在bind返回的函數(shù)實(shí)際執(zhí)行的時(shí)候傳遞給它,基于這一點(diǎn)我們才可以收集參數(shù),最后統(tǒng)一運(yùn)算,但是為什么bind返回的函數(shù)的length就剛好是length-args.length呢?
急求!?。?!實(shí)現(xiàn)函數(shù)柯里化,最后返回柯里化函數(shù)的時(shí)候?yàn)槭裁床恍枰~外傳參?跪求!
紅糖糍粑
2019-10-31 09:36:37