在全局范围内预定义变量的优点是什么?

时间:2013-05-30 11:23:58

标签: javascript coding-style jslint jshint

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

情况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
}

请注意, “操作msg” 我不是指一个功能,而是一堆操作。

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

更新 在提出这个问题时我可能是不正确的,以便清除我已经改变了功能的情况。

更新2 我理解范围。我的意思是,除了范围之外,还有其他优势吗?

3 个答案:

答案 0 :(得分: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中,只有一个函数可以创建一个范围。即使有其他控制语句的内括号,函数中声明的所有内容都将在整个函数范围内可用。在函数内的不同行中声明的所有变量都将被提升并处理,就像在函数的起始行中声明一样。

答案 1 :(得分:0)

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

答案 2 :(得分:0)

你了解范围吗?

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

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

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

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

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

相关问题