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

标签 javascript closures

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

相关文章:

java - 如何在 LISP 解释器中实现闭包

javascript - 如何在我的 HTML 网页中包含我的 Javascript 文件和/或 jQuery

javascript - 如何在 node.js 中同步函数和 promises

javascript - 如何在div中查找内容是否可用?

带闭包和 IIFE 的 JavaScript 计数器

javascript - 为什么这个javascript不断递归

java - 常规闭包内部如何工作?

javascript - Vue.js router init 与 router.map 一起使用,而不是与 Router 构造函数一起使用

javascript - 现有 javascript 库的最小 typescript 定义

c++ - 序列化函数对象