对js函数语法感到困惑

时间:2018-07-22 06:52:08

标签: javascript function ecmascript-6

我在freecodecamp.org上进行了一些ES6语法练习,在理解上下文时遇到了一些困难。我知道这在JS中称为IIFE

(function () {
    statements
})();

这样就可以了,但是为什么不把..args放在 first sum里面呢,而不是只把内部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

  

主要问题是为什么函数sum返回另一个函数   sum

1 个答案:

答案 0 :(得分:4)

在第一个代码中,不带任何参数的情况下调用了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

在第二个代码中,只有一个函数,没有包装在另一个函数中的函数,并且总是使用参数调用一个函数 。如果使用 no 参数调用它并将它们传播到console.log中,您将看到相同的效果:

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