无法从全局上下文中读取变量

时间:2014-07-06 15:40:06

标签: javascript

JS:

var a = 10;

function test() {
    alert(a);
    var a = 20;
    alert(a);
}

test();

上面的代码昨天与一位采访者进行了讨论,我说第一次浏览器会提醒10,下次它会提醒20,但我错了。它第一次警告未定义,第二次警告20。我很困惑,任何人在理论上和实际上都可以解释这背后会发生什么......?

相关链接非常有用。

DEMO

2 个答案:

答案 0 :(得分:6)

在一个函数中,每个var都被视为它出现在函数的最顶层。因此,您的代码被解释为它被写成:

function test() {
  var a;
  alert(a);
  a = 20;
  alert(a);
}

它被称为吊装。请注意,它是声明,而不是初始化分配。

这里的效果是在该函数内的任何地方,a引用局部变量,该变量隐藏了视图中相对全局的a

Here is the relevant section of the ES5 spec.它有些不透明。

答案 1 :(得分:1)

当你的变量在函数的局部范围内找到时,它就不会引用全局变量。全局变量的范围隐藏在函数内部,因此您第一次获得未定义的值。

这个概念叫做提升,即在JavaScript中,变量可以在使用后声明。换一种说法;变量可以在声明之前使用。