代码之家  ›  专栏  ›  技术社区  ›  A l w a y s S u n n y

对JS函数语法感到困惑

  •  1
  • A l w a y s S u n n y  · 技术社区  · 6 年前

    我在freecodecamp.org上做了一些ES6语法练习,在理解上下文时遇到了一些困难。 IIFE 在JS中,

    (function () {
        statements
    })();
    

    所以,这没关系,但为什么我不 ..args 第一 sum 也不是内在的 总和 只有?

    const sum = (function(...args) {
      console.log(...args); //this shows nothing
      return function sum(...args) {
        console.log(...args); // this shows 1,2,3
        return args.reduce((a, b) => a + b, 0);
      };
    })();
    console.log(sum(1, 2, 3)); // 6

    如果我用这个修改上面的代码片段,他们会做同样的事情吗?引擎盖下面有什么逻辑上的区别吗?

    function sum(...args) {
      console.log(args);
      return args.reduce((a, b) => a + b, 0);
    }
    console.log(sum(1, 2, 3)); // 6

    主要问题是为什么函数 总和 返回另一个函数 总和 在里面。

    1 回复  |  直到 6 年前
        1
  •  4
  •   CertainPerformance    6 年前

    在第一个代码中,调用IIFE时没有参数,请参见:

    })();
    

    所以,结果 args 数组为空,当扩散到参数列表中时,生成的参数列表为空;没有要记录的内容。 console.log 如果参数列表为空,则不执行任何操作。它 但是,如果使用至少一个参数调用IIFE,请记录一些内容:

    const sum = (function(...args) {
      // Now, it shows something!
      console.log(...args);
      return function sum(...args) {
        console.log(...args); // this shows 1,2,3
        return args.reduce((a, b) => a + b, 0);
      };
    })(9999);
    console.log(sum(1, 2, 3)); // 6

    在第二个代码中,只有一个函数,而不是包装在另一个函数中的函数,而这个函数 总是用参数调用。如果你打电话给 参数并将它们分散到 控制台日志 你会看到同样的效果:

    function sum(...args) {
      console.log(...args);
      return args.reduce((a, b) => a + b, 0);
    }
    sum(); // 6