为什么要将全局变量传递给函数?

时间:2017-02-16 21:47:58

标签: javascript scope es5-shim

我已经看到了同样的代码,并且想知道它们之间是否有任何权衡。

方法1:

UIStackView

方法2:

(function(i) {
    // Do something to i now
}(global_variable))

为什么要将全局变量传递给函数,如果它仍然存在于该范围内?

3 个答案:

答案 0 :(得分:3)

在这种情况下,它给出了明确的说明,即此函数使用全局并创建更容易键入的别名。此外,它使访问变量的速度更快,因为它不需要搜索所有范围,直到它在全局范围内找到它。

对于常规函数,而不是示例中的iife,它会使您的函数更易于测试,因为您可以更轻松地模拟传递的全局函数。

答案 1 :(得分:1)

出于别名的目的,例如:

(function(leeloo){

    //inside here you can use the short term

})(LeeloominaiLekataribaLaminaTchaiEkbatDeSebat)

//this would be similar, it's a matter of preference
(function(){
    var leeloo = LeeloominaiLekataribaLaminaTchaiEkbatDeSebat;

    //...
})()

或包含一个值,如下例所示:

(function($){

    //in here, $ preserves the passed/injected value, 
    //even if the global value changes

})(jQuery.noConflict())

这样你甚至可以在同一页面中使用多个版本的jQuery。

答案 2 :(得分:1)

如果您因某些原因不想永久更改global_variable的值,可能需要使用第一个示例。例如。执行此代码后,本地副本将被更改,但全局变量将保持不变。

global_variable=true; (function(i){ i=false; return i; }(global_variable));

但是,此代码显然会改变global_variable

global_variable=true; (function(){ global_variable=false; }());

编辑:有些切线,这种变化看起来像是改变了全局变量,但它并不是因为调用函数会创建全局变量的卷影副本。您可能应该避免使用此模式,因为它可能会产生混淆:

g=true; (function(g){ g=false; return g; }(g));