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

Raj*_*amy 2 javascript

JS:

var a = 10;

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

test();
Run Code Online (Sandbox Code Playgroud)

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

相关链接将非常有用.

DEMO

Poi*_*nty 6

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

function test() {
  var a;
  alert(a);
  a = 20;
  alert(a);
}
Run Code Online (Sandbox Code Playgroud)

它被称为吊装.请注意,它是提升的声明,而不是初始化赋值.

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

这是ES5规范的相关部分.它有些不透明.