【问题标题】:Javascript why wrap a variable or constructor in an IIFE?Javascript 为什么要在 IIFE 中包装变量或构造函数?
【发布时间】:2014-05-07 10:50:42
【问题描述】:

我今天看到了这样的东西

var Visualizer = (function() {
    function Visualizer() {
    //...
    }
    Visualizer.prototype.function1 = function () { /* ... */ }
    //...
    return Visualizer;
})();

var viz = new Visualizer();

我不明白这与仅仅摆脱 iife 包装器相比有什么意义。

【问题讨论】:

  • 好吧,在那种特定情况下并没有太多好处,但是如果您需要一些辅助函数怎么办?那时它很有用,因为您将它们保密,并且不会泄漏到全局范围。
  • 就像将辅助函数放在包装器中而不是函数中一样?将它们放在函数中有什么区别?
  • 如果你这样做,你每次调用new时都会创建帮助函数。
  • 它允许创建作用域变量,一些变量可能只在函数中可用,而在全局作用域中不可用。

标签: javascript iife


【解决方案1】:

您在此处显示的特定构造没有意义。在这种类型的构造中使用 IIFE 的原因是当您有需要声明的静态数据,希望对您的对象可用,但不希望它可公开访问或干扰全局命名空间或成为实例时数据。

由于您显示的代码没有显示任何这些,因此它并没有真正提供您所展示的任何好处。但是,如果在对象之外,但在 IIFE 内部声明了一些其他变量,那么 IIFE 会保护和封闭它们,并将它们与外界隔离。

例如,如果你有这个:

Visualizer = (function() {
  var counter = 0;
  function Visualizer() {
    counter++;
    ...
  }
  Visualizer.prototype.getCount = function () { return counter; }
  ...
  return Visualizer;
})();

var viz = new Visualizer();

然后,IIFE 将包含一个变量 counter,该变量可用于 Visualizer 的所有实例的所有方法,但与外界隔离,IIFE 将提供一些潜在的好处。

【讨论】:

    【解决方案2】:

    对不起,我措辞含糊,但我认为带有说词的 JS 需要正确括起来才能知道哪些操作优先,哪些属于什么相当于简单地说“知道什么是什么”并说明 python 只是在说如果它没有这些括号,它会正确地求助于不需要括号和的python之类的方法;缩进很重要。可能我错过了整个问题,但我认为我说得对。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2019-10-13
      • 1970-01-01
      • 2017-05-30
      • 2016-10-10
      • 2012-08-10
      • 1970-01-01
      • 2014-02-09
      相关资源
      最近更新 更多