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

Javascript 为什么要将全局变量传递给函数?,javascript,scope,es5-shim,Javascript,Scope,Es5 Shim,我见过同样的代码以两种方式编写,不知道它们之间是否有任何折衷 方法1: (function(i) { // Do something to i now }(global_variable)) 方法2: (function() { // Do something to global_variable now }()) 如果函数将存在于该作用域中,为什么要将全局变量传递给该函数?在这种情况下,它给出了明确的指示,说明该函数使用全局变量并创建了一个更易于键入的别名。此外,它使访问变

我见过同样的代码以两种方式编写,不知道它们之间是否有任何折衷

方法1:

(function(i) {
    // Do something to i now
}(global_variable))
方法2:

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

如果函数将存在于该作用域中,为什么要将全局变量传递给该函数?

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


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

出于别名目的,例如:

(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。

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

global_variable=true; (function(i){ i=false; return i; }(global_variable));
但是,此代码明显改变了
全局变量

global_variable=true; (function(){ global_variable=false; }());
编辑:从某种程度上说,这种变化看起来像是改变了全局变量,但事实并非如此,因为调用函数会创建全局变量的卷影副本。您可能应该避免这种模式,因为它可能会造成混淆:

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

第一个代码块应该在函数内部使用
i
,而不是
global\u变量
。它可以提高引用变量的性能。在JavaScript中,变量的作用域越近,使用它的速度就越快。避免冲突。如果以后有什么东西替换了存储在
全局_变量
中的引用,iife中的代码就不重要了。@KevinB不确定它是否重要,因为它是立即执行的。@rasmeister如果
//做一些事情
是异步的呢?请注意,在第二种情况下,只有在iife中执行异步操作时,这样做才有好处,否则就没有理由保留它。但是,jquery几乎总是这样。@KevinB
在iife中执行异步操作
。。。与包含用户交互(jquery的主要用例之一)的功能非常相似。是的,jquery并不是最好的例子,但在我脑海中却是最好的例子,没有做太多的东西(保持通用性)。它只是使用iife作为闭包来封装和保留传递的值,而不管全局变量发生了什么。使用jquery,您最有可能绑定事件,从而执行异步操作。因此,这是一个很好的例子(即使同样可以使用
$(function($){…})
)来实现)@rasmeister请删除我们已经散列出来的注释