我在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
。
答案 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