将全球变量传递给自我调用函数或" IIFE"

时间:2016-04-27 06:58:55

标签: javascript node.js

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

(function (w){

    w.bar = 'baz';

 })(window); 

以上优点是什么?

(function(){

    window.bar = 'baz';

})(); 

同样适用于global variableIIFE之外定义的变量。

4 个答案:

答案 0 :(得分:12)

  1. 明确表示您正在使用(并可能修改)函数中的全局变量。
  2. 允许您以后修改行为。也许你有mockWindow的单元测试。也许您使用的是Node.js而您没有window,但想要添加到globals var。
  3. 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首先在本地范围内查找属性,然后向上链接到全局范围。因此,在本地范围访问窗口对象会减少查找时间。