目前我的结果未定义,我不明白为什么会这样。
var variable = "top-level";
function parentFunction() {
function childFunction() {
alert(variable);
}
childFunction();
var variable = "local";
}
parentFunction();
我认为是因为我宣布了变量
var variable = "local";
在我调用childFunction()之后,它会查找范围链并获取顶级变量,但似乎并非如此。
答案 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
。
这称为变量吊装。