9

我今天看到了这样的东西

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

var viz = new Visualizer();

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

4

2 回答 2

23

您在此处显示的特定构造没有意义。在这种类型的构造中使用 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 将提供一些潜在的好处。

于 2014-03-28T05:45:03.420 回答
-3

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

于 2014-03-28T06:33:30.303 回答