2

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

情况一):

 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 我了解范围。我的意思是,尽管范围很广,但还有其他优势吗?

4

3 回答 3

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 中,只有一个函数可以创建一个范围。即使有其他控制语句的内括号,函数中声明的所有内容都将在整个函数范围内可用。函数内不同行中声明的所有变量都将被提升并视为在函数的起始行中声明。

于 2013-05-30T11:45:06.943 回答
0

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

于 2013-05-30T11:27:43.003 回答
0

你了解范围吗?

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

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

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

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

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

于 2013-05-30T11:28:23.343 回答