为了账号安全,请及时绑定邮箱和手机立即绑定

函数柯里化问题

函数柯里化问题

子衿沉夜 2019-03-19 17:18:03
//函数柯里化 这个可以理解    // 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);    };请问第二个函数怎么理解 她是怎么保存之前输入的参数的?求详细解答 谢谢
查看完整描述

1 回答

?
慕少森

TA贡献2019条经验 获得超9个赞

judge并没有立即执行,而是在(...arg)=>judge(...args,...arg);方法被调用时才被执行

这个curry后的函数只有在传入的最后一个参数可以被转换为false的时候才开始执行,它存参数的方法也很简单

1,判断如果最后一个参数是否可以是false

2,是的话就把所有保存的参数放到fn里执行,结束

3,否则,返回一个新的匿名函数,这个函数把所有传入参数保存在arg数组中,而这个匿名函数被执行后,就把以前收到的参数数组和当前的参数数组合并后,放到前面说的逻辑中,在judge函数里判断,重复第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都是这个函数

                return judge(...args, ...arg);

            }

        }

    }

    return judge;

}


查看完整回答
反对 回复 2019-03-30
  • 1 回答
  • 0 关注
  • 397 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信