这两个闭包示例的优点是在后续函数调用中保留 count 的值,否则(如果未使用闭包),count 将在每次函数调用后重置为 0。此外,在这两种情况下,count 变量(与 block 中的任何 let 变量一样)都是私有(private)的,即不可全局访问。
IFFE 闭包示例改编自 Marius Schulz' article ,他在其中建议了这种用法。我能想到的使用闭包的 IFFE 版本相对于常规版本的唯一优点是您不必命名它(您只需将它分配给一个变量以便再次调用它) - 或者如果你确实命名了它,它在全局范围内是不可见的——因此污染全局命名空间的项少了一项。还有其他我忽略的好处吗?
定期关闭:
function createCounter() {
let count = 0;
return function() {
++count;
return `count equals ${count}`;
};
};
let counter = createCounter();
console.log(counter()); // count equals 1
console.log(counter()); // count equals 2
IFFE 关闭:
let countingFunction = (function() {
let count = 0;
return function() {
++count;
return `count equals ${count}`;
};
})();
console.log(countingFunction()); // count equals 1
console.log(countingFunction()); // count equals 2
编辑:标记为重复的问题是另一个问题,并且所选答案不回答此问题。
最佳答案
区别在于 IIFE 闭包只能使用一次,而第一个闭包可以在需要时调用来创建新的迭代器,有点像生成器。
例如,如果您想要按需迭代一个一个个队列,则可以使用第二个 IIFE 版本,但如果您有两个 个队列,您可以调用 countingFunction
两次来创建单独的计数器。
但是,如果您只需要一个这样的计数器,则可以将其包装为 IIFE,以明确表示它将使用一次,并且仅使用一次,并避免创建不会使用的变量再次。 (这对于脚本优化不是很有用,而是对于可读性有用)
旁注 - 更一致地命名变量可能会更清晰一些,因为第一个 countingFunction
与第二个 countingFunction
有很大不同。第一个在调用时创建一些重要的东西,第二个是一些重要的东西。也许调用第一个 makeCounter
和第二个 counter
:
定期关闭:
function makeCounter() {
let count = 0;
return function() {
++count;
return `count equals ${count}`;
};
};
let counter = makeCounter();
console.log(counter()); // count equals 1
console.log(counter()); // count equals 2
IFFE 关闭:
let counter = (function() {
let count = 0;
return function() {
++count;
return `count equals ${count}`;
};
})();
console.log(counter()); // count equals 1
console.log(counter()); // count equals 2
关于javascript - 为什么使用 IFFE 闭包而不是常规闭包?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/50979943/