变量提升 - 函数中具有全局变量名称的“var”

时间:2014-01-13 16:55:05

标签: javascript scope hoisting

我正在练习一些场景并找到一个案例:

Here is fiddle

根据闭包栏功能应该有var x的访问权限,所以我预计会因为if(!1)而警告1并且条件变为假,但它会提醒undefined并且条件变为真,第二个警报是价值10。

var x = 1;
function bar() {
    alert(x);
    if (!x) {
        var x = 10;
    }
    alert(x);
}
bar();

所以我很困惑为什么它会提示未定义?

根据特定范围内的提升,您可以在任何位置始终定义变量。

如果是由于提升效应,它仍然需要警告10而不是未定义。

2 个答案:

答案 0 :(得分:5)

提升导致变量在函数中的任何地方声明,未定义。

bar的第一行,由于该函数的第3行有var x,因此全局x被屏蔽,您会看到本地x(是undefined,因为尚未给出值。)

bar的第3行,您有x = 10来定义变量。这没有悬挂。

在第5行,您提醒它,现在已定义。

Venn Diagram of the above

答案 1 :(得分:1)

吊装将使您的代码有效地工作:

var x;
x = 1;
function bar() {
    var x; //same as var x = undefined;
    alert(x);
    if (!x) {
        x = 10;
    }
    alert(x);
}
bar();