1

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

这是小提琴

根据关闭栏功能应该可以访问,var x所以我希望警报 1 并且条件因为错误而变为错误,if(!1)但它发出警报undefined并且条件为真,第二个警报的值为 10。

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

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

根据在特定范围内的提升,您可以在任何地方定义一个变量,它总是被认为是在顶部定义的。

如果是由于吊装效应,它仍然必须警告 10 而不是 undefined。

4

2 回答 2

5

提升会导致在函数中的任何地方声明一个变量,而不是定义。

在 的第一行bar,因为var x在函数的第 3 行,全局x被屏蔽了,你看到了本地x(这是undefined因为它还没有被赋予一个值)。

在第 3 行bar,您有x = 10which 定义了变量。这不是吊起来的。

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

以上的维恩图

于 2014-01-13T16:56:22.030 回答
1

提升将使您的代码像这样有效地工作:

var x;
x = 1;
function bar() {
    var x; //same as var x = undefined;
    alert(x);
    if (!x) {
        x = 10;
    }
    alert(x);
}
bar();
于 2014-01-13T16:59:50.773 回答