【问题标题】:What are advantages of predefining variable in global scope?在全局范围内预定义变量有什么好处?
【发布时间】:2013-05-25 22:52:12
【问题描述】:

我经常会根据自己的心情行事:

情况 A):

 function a() {
     var msg = 'a()';
     ..operate on msg
   }

   function b() {
     var msg = 'b()';
     ..operate on msg
   }

情况 B):

var msg;
function a() {
  msg = 'a()';
 ..operate on msg
}

function b() {
  msg = 'b()';
 ..operate on msg
}

请注意,"operate on msg"并不是指一个函数,而是一堆操作。

我对此很感兴趣,因为 JSHint 指出变量已经预定义,尽管它们具有相同的名称但例如出现在不同的函数中。

更新: 我在问这个问题时可能是不正确的,以便清除我更改功能的情况。

更新 2 我理解范围。我的意思是,尽管范围很广,但还有其他优势吗?

【问题讨论】:

  • 这不是不同的闭包。
  • @tracevipin 我已将其替换为“功能”。如果我有两个定义相同变量名的函数,linter 会生气
  • @lukas.pukenis 在这个问题的第一个版本之后,我怀疑你完全理解 JavaScript 中的作用域。
  • @Sirko,很抱歉我的问题表现不佳。我对范围界定没有任何问题。我主要关心的是用很多函数重构丑陋的大 JS 文件,如果语句一遍又一遍地使用相同的变量名:)

标签: javascript coding-style jslint jshint


【解决方案1】:

正如其他人所建议的,您必须阅读更多关于 Javascript 中的变量提升的信息。 我会尝试演示一下。

function test() {

    var t1 = msg + " hello";  
    console.log(t1); // prints "undefined hello" because msg is undefined
    var t2 = msgx + " hello"; // msgx ReferenceError

    var a = 1;
    var b = 2;
    if (a > b) {
        var msg = 'sample';
    }

}

test();

在示例中,您可以看到声明了msg。但它是未定义的。另一方面,msgx 导致引用错误。它没有在任何地方声明。所以重点是 var msg = 'sample'; 语句,它稍后出现在 if 大括号内的函数中,使得 msg 在函数中的任何地方都是一个有效的变量。所以再次声明msg 会给你预定义的变量警告。

在 javascript 中,只有函数可以创建作用域。即使有其他控制语句的内花括号,函数中声明的所有内容都将在整个函数范围内可用。在函数内不同行中声明的所有变量都将被提升并视为在函数的起始行中声明。

【讨论】:

    【解决方案2】:

    这几乎没有区别...在每种情况下都定义了变量,但如果您不使用 msg 变量,第一种情况会节省一点数据 :) 但这太简单了。

    【讨论】:

    • 是的,这里的优化是不存在的,但是我有很多文件需要用很多函数重构,如果语句都一遍又一遍地定义相同的名称:)
    • 我明白了......好吧,如果您在多种情况下使用该全局,则必须为每种情况初始化它......如果没有重新初始化,您可能会使用错误的数据并导致逻辑错误。 ..
    • 我也这么认为,尽管可能还有更多情况需要考虑。无论如何,感谢您的洞察力! :)
    • 一般来说,全局变量对一些全局标志有好处......这可能对你的情况有好处,但正如我所说,你必须注意你是否使用了好的数据。
    【解决方案3】:

    你了解范围吗?

    在情况 B 中,您的变量仅在函数范围内可用。

    function(){
        var foo = 10;
    }
    console.log(foo); //undefined
    

    在情况 A 中,您的变量在全局范围内可用。

    var foo;
    function(){
        foo = 10;
    }
    console.log(foo); //10
    

    在情况 A 中,从函数内部修改 foo 会在任何地方修改它。情况B,只修改局部变量。

    【讨论】:

    • 对不起,我没有提到它,但我了解范围。我了解它是如何工作的,但是在重构时,我有很多由许多函数组成的大文件,这些函数一遍又一遍地使用相同的变量名。这就是我提出问题的原因
    猜你喜欢
    • 2012-05-26
    • 1970-01-01
    • 2012-04-29
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-11-13
    • 2012-02-16
    • 2015-11-24
    相关资源
    最近更新 更多