繁体   English   中英

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

[英]Purpose of passing global vars to self-invoking function or “IIFE”

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

(function (w){

    w.bar = 'baz';

 })(window); 

上面有什么优点,结束了

(function(){

    window.bar = 'baz';

})(); 

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

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

ps 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传递窗口时; 所有显示的方法都可以在局部变量中使用。

通过将全局对象(如window,document,$)传递给IIFE(立即调用函数表达式),可以通过缩短范围查找时间来提高性能。 记住Javascript首先在本地范围内查找属性,然后向上链接到全局范围。 因此,在本地范围访问窗口对象会减少查找时间。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM