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

3
我看到同样的代码用两种方式编写,想知道它们之间是否有任何权衡。
方法1:
(function(i) {
    // Do something to i now
}(global_variable))

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

如果一个全局变量本来就存在于函数的作用域中,为什么还要将它传递给函数呢?

2
第一个代码块应该在函数内使用 i,而不是 global_variable - Barmar
它可以提高引用变量的性能。在JavaScript中,变量与其作用域越接近,使用速度就越快。 - David
1
为了避免冲突,如果以后有其他内容替换了存储在global_variable中的引用,立即执行函数内部的代码不会受到影响。 - Kevin B
@KevinB 不确定这是否重要,因为它会立即执行。 - rasmeister
1
@rasmeister 如果 // Do something 是异步的呢? - Kevin B
@KevinB 那很有道理。我认为在那种情况下,这可能很重要。好观点! - rasmeister
3个回答

3
在这种情况下,它清晰地说明了这个函数使用全局变量并创建更易于键入的别名的具体指令。此外,它使访问变量变得更快,因为它不需要在所有作用域中搜索直到在全局作用域中找到它。
对于常规函数而言,在您的示例中不是一个iife,它使您的函数更易于测试,因为您可以更轻松地模拟传递的全局变量。

@rasmeister请删除评论,现在我们已经讨论清楚了。 - Ruan Mendes

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。

1
请注意,在第二种情况下,只有在 IIFE 中执行异步操作时才有保留它的好处,否则没有保留它的理由。但是,这在 jQuery 中几乎总是适用的。 - Kevin B
@KevinB 在 iife 中执行异步操作,比如用户交互等,这是 jQuery 的主要用例之一。是的,jQuery 不是最好的例子,但是在不制造太多东西(保持通用)的情况下,这是我能想到的最好的例子。它只是使用 iife 作为闭包来封装和保留传递的值,无论全局变量发生了什么。 - Thomas
没错。使用jQuery时,你很可能会绑定事件,从而执行异步操作。因此,这是一个很好的例子(即使可以使用 $(function ($){...}) 来完成相同的操作)。 - Kevin B

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));

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接