我在较旧的JavaScript中看到了很多这样的内容
(function (w){
w.bar = 'baz';
})(window);
以上优点是什么?
(function(){
window.bar = 'baz';
})();
同样适用于global variable
或IIFE
之外定义的变量。
答案 0 :(得分:12)
mockWindow
的单元测试。也许您使用的是Node.js而您没有window
,但想要添加到globals
var。P.S。 IMO @Rayon提到的微不足道的性能提升是一个红色的鲱鱼。
答案 1 :(得分:3)
在实践中,你给出的例子没有太多(任何?)差异,但是你实际上看到的代码中有可能过于简单。
在一个更现实的程序中,您将拥有在异步环境中触发和运行的作用域和回调,并且您将变量绑定到闭包中的特定实例 - 所以;
(function (w){
setTimeout(function(){w.bar = 'baz';},100);
})(window);
window = window2;
该栏仍在原始窗口中设置,因为这是绑定到w
的位置 -
(function (){
setTimeout(function(){window.bar = 'baz';},10);
})(window);
window = window2;
它将在实例window2中设置,因为这是在最终发生代码执行时窗口的绑定方式。
在这个例子"窗口"是一个全局变量,但无论绑定变量的范围如何,情况都是如此。
答案 2 :(得分:2)
完成传递窗口是因为局部变量比全局变量更容易和更快地访问...这可能会在性能上略有不同。该方法确实派上了模块模式和/或依赖注入。
示例强>
var moduleFirst = (function(){
var name = "harry";
return {
firstparam : name
}
})();
var moduleTwo = (function(x){
console.log(x.firstparam);
})(moduleFirst)
输出将是:harry
所以当IIFE传递窗口时;所有显示的方法都可以在局部变量中使用。
答案 3 :(得分:1)
通过将窗口,文档,$等全局对象传递给IIFE(立即调用函数表达式),可以通过缩短范围查找时间来提高性能。 请记住,Javascript首先在本地范围内查找属性,然后向上链接到全局范围。因此,在本地范围访问窗口对象会减少查找时间。