将全局variables传递给自调函数或“IIFE”

我在老版本的JavaScript中看到了很多

(function (w){ w.bar = 'baz'; })(window); 

以上的优点是什么?

 (function(){ window.bar = 'baz'; })(); 

任何global variable或在IIFE之外定义的variables也是IIFE

  1. 明确表示您正在使用(也可能是修改)函数中的全局variables。
  2. 允许您修改将来的行为。 也许你有一个unit testing的mockWindow 。 也许你正在使用Node.js,你没有一个window ,而是想添加到globals var。

ps IMO @Rayon提到的微不足道的performance增益是红鲱鱼。

在实践中,与你所提供的例子没有太大的区别,但是你可能已经从你实际看到的代码中简化了它。

在一个更为实际的程序中,你将有范围和callback,它们被asynchronous触发并在事件循环中运行,并且将variables绑定到闭包中的特定实例 – 所以;

 (function (w){ setTimeout(function(){w.bar = 'baz';},100); })(window); window = window2; 

酒吧仍然在原来的窗口,因为这是什么必然w – 在哪里

 (function (){ setTimeout(function(){window.bar = 'baz';},10); })(window); window = window2; 

它将被设置在实例窗口2中,因为当代码的执行最终发生时,窗口是如何被绑定的。

在这个例子中,“window”是一个全局variables,但不pipe被绑定variables的范围如何。

因为局部variables比全局variables更容易和更快速地访问,所以完成了传递窗口……这可能会在性能上稍有差异。 该方法真的可以用模块模式和/或dependency injection派上用场。

 var moduleFirst = (function(){ var name = "harry"; return { firstparam : name } })(); var moduleTwo = (function(x){ console.log(x.firstparam); })(moduleFirst) 

输出将是:哈利

所以当窗口通过IIFE时, 它的所有显示方法都可以在局部variables中使用。

通过将全局对象(如窗口,文档,$)传递给IIFE(立即调用的函数expression式),可以通过缩短范围查找时间来提高性能。 记住Javascript首先在本地范围内寻找属性,然后链接到全局范围。 所以在本地范围访问窗口对象减less了查找时间。