函数柯里化问题


    //函数柯里化 这个可以理解
    // 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);
    };

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

阅读 2.3k
1 个回答

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;
}
撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题