不应该将此变量默认为"顶级"?

时间:2014-04-22 13:20:25

标签: javascript scope

目前我的结果未定义,我不明白为什么会这样。

var variable = "top-level";

function parentFunction() {
  function childFunction() {
    alert(variable);
  }
  childFunction();
  var variable = "local";
}

parentFunction();

我认为是因为我宣布了变量

var variable = "local";
在我调用childFunction()之后,它会查找范围链并获取顶级变量,但似乎并非如此。

2 个答案:

答案 0 :(得分:1)

这是因为提升,这是将所有var语句放在函数的顶部,但仍然在它的行上执行赋值语句。如果你看一下,第二个var variable将影响全局变量,因为它声明了一个具有相同名称的局部变量。然后,这个新声明的变量将是undefined,直到它到达赋值行。

基本上,这就是你的代码所做的事情:

var variable = "top-level";

function parentFunction() {
  var variable;
  function childFunction() {
    alert(variable);
  }
  childFunction();

  variable = 'local';

}

parentFunction();

答案 1 :(得分:1)

所有变量声明语句都将移动到声明它们的函数的顶部,但只有当控件到达声明/初始化语句时,才会将值赋给它们。在您的情况下,childFunction没有variable,因此它会在范围内上升并检查parentFunction,其中variable已声明但尚未分配值。因此,它会提醒默认值undefined

这称为变量吊装。