gpt4 book ai didi

javascript - 为什么使用 IFFE 闭包而不是常规闭包?

转载 作者:行者123 更新时间:2023-11-29 16:36:25 26 4
gpt4 key购买 nike

这两个闭包示例的优点是在后续函数调用中保留 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/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com