为什么这个JS代码打印未定义?

时间:2015-04-03 18:55:30

标签: javascript

我不明白为什么foo的值在以下代码中未定义:

var foo = 1;

function bar() {
    if (false) {
        var foo = 10;
    }
    alert("Foo is " + foo);
}

bar();

结果:Foo是undefinedhttps://jsfiddle.net/yk7ae9b0/

尽管这些变化的行为符合预期。

var foo = 1;

function bar() {
    if (true) {
        var foo = 10;
    }
    alert("Foo is " + foo);
}

bar();

结果:Foo是10

var foo = 1;

function bar() {
    if (false) {
       // var foo = 10;
    }
    alert("Foo is " + foo);
}

bar();

结果:Foo为1

任何帮助都将非常感激。

1 个答案:

答案 0 :(得分:6)

您的var foo未定义在您认为的位置。 JavaScript中的变量的范围限定为使用它们的函数,而不是声明它们的块。因此,您拥有的代码:

function bar() {
  if (false) {
    var foo = 10;
  }
  alert(foo);
}

JS引擎实际上解释,好像它被写成:

function bar() {
  var foo;
  if (false) {
    foo = 10;
  }
  alert(foo); // foo was never assigned a value!
}

因此,当警报触发时,您有一个未定义的变量foo,它会影响您在函数外声明的全局foo

(这也会影响像for(var i=...) ...这样的事情 - var i是函数范围的,并且在函数内部的任何地方都是声明的变量,而不仅仅是for循环中的