将全局variables传递给自调函数或“IIFE”
我在老版本的JavaScript中看到了很多
(function (w){ w.bar = 'baz'; })(window);
以上的优点是什么?
(function(){ window.bar = 'baz'; })();
任何global variable
或在IIFE
之外定义的variables也是IIFE
。
- 明确表示您正在使用(也可能是修改)函数中的全局variables。
- 允许您修改将来的行为。 也许你有一个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了查找时间。