将全局变量传递给自调用函数或“IIFE”的目的

Purpose of passing global vars to self-invoking function or "IIFE"

本文关键字:IIFE 函数 调用 全局变量      更新时间:2023-09-26

我在较旧的JavaScript中看到了很多这样的

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

以上有什么优势,超过

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

这同样适用于任何global variable,或在IIFE之外定义的变量。

  1. 明确表示您正在函数中使用(并可能修改)全局变量。
  2. 允许您在将来修改行为。 也许您有单元测试的mockWindow。也许您正在使用 Node.js并且您没有 window ,但想添加到 globals var 中。

附言 IMO @Rayon提到的微不足道的性能提升是一条红鲱鱼。

在实践中,与你给出的例子没有太大(任何?)差异,但你可能已经从你实际查看的代码中过度简化了它。

在一个更现实的程序中,你将有范围和回调,它们在事件循环中异步触发和运行,并且你将变量绑定到闭包中的特定实例——所以;

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

该栏仍在原始窗口中设置,因为这是绑定到w的内容 - 在

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

它将在实例 window2 中设置,因为当代码最终执行时,这就是窗口的绑定方式。

在此示例中,"window"是一个全局变量,但无论绑定的变量的范围如何,情况都是一样的。

传递窗口完成是因为局部变量比全局变量更容易、更快地访问......这可能会显示 性能略有不同 .该方法在模块模式和/或依赖注入中确实派上用场。

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

输出将是:哈利

所以当窗口在IIFE中传递时;它所有揭示的方法都可以在局部变量中使用。

通过将窗口、文档、$ 等全局对象传递给 IIFE(立即调用的函数表达式),可以通过减少范围查找时间来增强性能。请记住,Javascript首先在本地范围内查找属性,然后向上链接直到全局范围。因此,在本地范围访问窗口对象可以减少查找时间。