函数柯里化问题

//函数柯里化 这个可以理解

    // curry = fn => {

    //     let arr = [];//保存之前输入的参数

    //     judge = (...args)=>{

    //         if(!args[args.length-1]){

    //             return fn(arr);

    //         }else{

    //             arr.push(...args);

    //             return judge;//返回一个表达式 调用才会执行

    //         }

    //

    //     };

    //     return judge;

    // }


    //函数柯里化 

    curry = fn => judge = (...args)=>{

        return !args[args.length-1]?fn(args):(...arg)=>judge(...args,...arg);//judge立即执行 调用自身 这不会死循环吗?

    };

    

    

      testCurry = (args)=>{

        args.pop();//去掉最后一个参数null

        if(args.length<1){

            return;

        }

        let sum = args.reduce((s,n)=>{

            return s+n;

        },0);

        console.log('参数',args);

        console.log('sum',sum);

        return sum;

    };

    

       OnClick =()=>{

        console.log('执行了这里 OnClick');

        let one = this.curry(this.testCurry)(1);

        let two = one(2)(3)(4)(5);

        let three = two(6,6,6,6);

        three(null);

    };

请问第二个函数怎么理解 她是怎么保存之前输入的参数的?

求详细解答 谢谢


子衿沉夜
浏览 398回答 1
1回答

慕少森

judge并没有立即执行,而是在(...arg)=>judge(...args,...arg);方法被调用时才被执行这个curry后的函数只有在传入的最后一个参数可以被转换为false的时候才开始执行,它存参数的方法也很简单1,判断如果最后一个参数是否可以是false2,是的话就把所有保存的参数放到fn里执行,结束3,否则,返回一个新的匿名函数,这个函数把所有传入参数保存在arg数组中,而这个匿名函数被执行后,就把以前收到的参数数组和当前的参数数组合并后,放到前面说的逻辑中,在judge函数里判断,重复第1步let curry = function(fn) {&nbsp; &nbsp; var judge = function(...args) {&nbsp; &nbsp; &nbsp; &nbsp; if (Boolean(args[args.length - 1])===false) {&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; return fn(args);//three(null)就到这里了&nbsp; &nbsp; &nbsp; &nbsp; } else {&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; return function(...arg) { //one和two和three都是这个函数&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; return judge(...args, ...arg);&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; }&nbsp; &nbsp; &nbsp; &nbsp; }&nbsp; &nbsp; }&nbsp; &nbsp; return judge;}
打开App,查看更多内容
随时随地看视频慕课网APP

相关分类

JavaScript