Javascript为什么要在IIFE中包装变量或构造函数?

Javascript为什么要在IIFE中包装变量或构造函数?,javascript,iife,Javascript,Iife,我今天看到了这样的东西 var Visualizer = (function() { function Visualizer() { //... } Visualizer.prototype.function1 = function () { /* ... */ } //... return Visualizer; })(); var viz = new Visualizer(); 我不明白这和扔掉生命包装有什么区别 这里显示的特定构造没有意义

我今天看到了这样的东西

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

var viz = new Visualizer();

我不明白这和扔掉生命包装有什么区别

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

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

例如,如果您有:

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

var viz = new Visualizer();

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

对不起,我含糊其辞,但我认为JS说的话需要正确地用括号括起来,以知道什么操作具有优先权,什么属于什么,这相当于简单地说“知道什么在什么中”,并说明python只是说,如果它没有这些括号,它将正确地求助于python这样的方法,其中不需要括号和括号;压痕很重要的地方。可能我错过了整个问题,但我想我大概答对了

在这种情况下没有什么好处,但是如果你需要一些帮助函数呢?这是有用的,因为您将它们保持为私有,并且不会泄漏到全局范围。例如,将助手函数放在包装器中而不是函数中?将它们放在函数中有什么区别?如果这样做,则每次调用
new
时都会创建帮助函数。它允许创建作用域变量,某些变量可能仅在函数中可用,但在全局作用域中不可用。