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

Why does this JS code print undefined?

本文关键字:打印 未定义 代码 JS 为什么      更新时间:2023-09-26

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

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

结果:Foo为undefined。https://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

任何帮助都将不胜感激。

您的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循环中的声明变量)