【问题标题】:Why would you pass a global variable to a function?为什么要将全局变量传递给函数?
【发布时间】:2017-07-06 05:37:28
【问题描述】:

我见过以两种方式编写相同的代码,想知道它们之间是否有任何权衡。

方法一:

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

方法二:

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

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

【问题讨论】:

  • 第一个代码块应该在函数内部使用i,而不是global_variable
  • 它可以提高引用变量的性能。在 JavaScript 中,范围越近的变量使用起来就越快。
  • 避免冲突。如果以后有东西替换了存储在global_variable 中的引用,则 iife 中的代码将不在乎。
  • @KevinB 不确定是否重要,因为它会立即执行。
  • @rasmeister 如果// Do something 是异步的怎么办?

标签: javascript scope es5-shim


【解决方案1】:

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

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

【讨论】:

  • @rasmeister 请删除 cmets,因为我们已将其删除
【解决方案2】:

例如用于别名目的:

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

【讨论】:

  • 请注意,在第二种情况下,只有在 iife 中执行异步操作时这样做才有好处,否则就没有理由保留它。但是,无论如何,jquery 几乎总是这样。
  • @KevinB performing something asynchronous within the iife ... 几乎包括用户交互,这是 jquery 的主要用例之一;)。是的,jquery 不是最好的例子,但是我想到的最好的例子,没有做太多的东西(保持通用)。它只是使用 iife 作为闭包来封装和保存传递的值,而不管全局变量发生了什么。
  • 没错。使用 jquery,您最有可能绑定事件,从而执行异步操作。所以这是一个很好的例子(尽管同样可以使用$(function ($){...})
【解决方案3】:

当您出于某种原因不想永久更改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));

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2013-02-09
    • 2022-01-14
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-05-14
    相关资源
    最近更新 更多