我在旧版 JavaScript 中经常看到这种情况。
(function (w){
w.bar = 'baz';
})(window);
以上的优势是什么,相较于......
(function(){
window.bar = 'baz';
})();
同样适用于任何全局变量,或在IIFE之外定义的变量。我在旧版 JavaScript 中经常看到这种情况。
(function (w){
w.bar = 'baz';
})(window);
以上的优势是什么,相较于......
(function(){
window.bar = 'baz';
})();
同样适用于任何全局变量,或在IIFE之外定义的变量。mockWindow
,或者您正在使用Node.js而没有window
,但是想要添加到globals
变量中。p.s. @Rayon提到的微不足道的性能增益在我看来是一个干扰项。
传递窗口是因为局部变量比全局变量更容易、更快速地访问...这可能会在性能上显示出轻微的差异。该方法在模块模式和/或依赖注入中非常方便。
示例
var moduleFirst = (function(){
var name = "harry";
return {
firstparam : name
}
})();
var moduleTwo = (function(x){
console.log(x.firstparam);
})(moduleFirst)
输出结果将是:harry
当window被传递给IIFE时,它的所有公开方法都可以在一个本地变量中使用。
(function (w){
setTimeout(function(){w.bar = 'baz';},100);
})(window);
window = window2;
由于原始窗口绑定到 w
,因此栏仍在原始窗口中设置 - 在哪里呢?
(function (){
setTimeout(function(){window.bar = 'baz';},10);
})(window);
window = window2;
由于代码执行时窗口绑定的方式是实例window2,因此它将在该实例窗口中设置。
在这个例子中,“window”是一个全局变量,但不管绑定变量的作用域如何,情况都是一样的。