鍍金池/ 問(wèn)答/C++  網(wǎng)絡(luò)安全  HTML/ 函數(shù)柯里化問(wèn)題

函數(shù)柯里化問(wèn)題


    //函數(shù)柯里化 這個(gè)可以理解
    // curry = fn => {
    //     let arr = [];//保存之前輸入的參數(shù)
    //     judge = (...args)=>{
    //         if(!args[args.length-1]){
    //             return fn(arr);
    //         }else{
    //             arr.push(...args);
    //             return judge;//返回一個(gè)表達(dá)式 調(diào)用才會(huì)執(zhí)行
    //         }
    //
    //     };
    //     return judge;
    // }

    //函數(shù)柯里化 
    curry = fn => judge = (...args)=>{
        return !args[args.length-1]?fn(args):(...arg)=>judge(...args,...arg);//judge立即執(zhí)行 調(diào)用自身 這不會(huì)死循環(huán)嗎?
    };
    
    
      testCurry = (args)=>{
        args.pop();//去掉最后一個(gè)參數(shù)null
        if(args.length<1){
            return;
        }
        let sum = args.reduce((s,n)=>{
            return s+n;
        },0);
        console.log('參數(shù)',args);
        console.log('sum',sum);
        return sum;
    };
    
       OnClick =()=>{
        console.log('執(zhí)行了這里 OnClick');
        let one = this.curry(this.testCurry)(1);
        let two = one(2)(3)(4)(5);
        let three = two(6,6,6,6);
        three(null);
    };

請(qǐng)問(wèn)第二個(gè)函數(shù)怎么理解 她是怎么保存之前輸入的參數(shù)的?
求詳細(xì)解答 謝謝

回答
編輯回答
命于你

judge并沒(méi)有立即執(zhí)行,而是在(...arg)=>judge(...args,...arg);方法被調(diào)用時(shí)才被執(zhí)行
這個(gè)curry后的函數(shù)只有在傳入的最后一個(gè)參數(shù)可以被轉(zhuǎn)換為false的時(shí)候才開(kāi)始執(zhí)行,它存參數(shù)的方法也很簡(jiǎn)單
1,判斷如果最后一個(gè)參數(shù)是否可以是false
2,是的話就把所有保存的參數(shù)放到fn里執(zhí)行,結(jié)束
3,否則,返回一個(gè)新的匿名函數(shù),這個(gè)函數(shù)把所有傳入?yún)?shù)保存在arg數(shù)組中,而這個(gè)匿名函數(shù)被執(zhí)行后,就把以前收到的參數(shù)數(shù)組和當(dāng)前的參數(shù)數(shù)組合并后,放到前面說(shuō)的邏輯中,在judge函數(shù)里判斷,重復(fù)第1步

let curry = function(fn) {
    var judge = function(...args) {
        if (Boolean(args[args.length - 1])===false) {
            return fn(args);//three(null)就到這里了
        } else {
            return function(...arg) { //one和two和three都是這個(gè)函數(shù)
                return judge(...args, ...arg);
            }
        }
    }
    return judge;
}
2017年10月29日 17:42