函数柯里化问题

发布于 2022-09-07 04:27:43 字数 1138 浏览 29 评论 0


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

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

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(1

雾里花 2022-09-14 04:27:43

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;
}
~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文