JavaScript条件执行和变量范围

lam*_*kie 1 javascript scope conditional-statements

我提前道歉,之前可能已经在StackOverflow上讨论了,我只是不知道这叫什么,所以我找不到满意的答案.

但是,我正在学习JavaScript和一本名为"Eloquent JavaScript"的书.在那里,我找到了以下代码,它反复提示用户输入他的名字,直到他这样做.

while (!input) {
    var input = prompt("Who are you?");
}
Run Code Online (Sandbox Code Playgroud)

我根本不明白为什么这实际上有效而不是引发错误.在评估条件表达式时,没有称为输入的变量.如果我理解正确,则无法进行评估,这通常会阻止进一步执行.在while循环体,它的声明,然后创建一个名为变量输入,仍在执行,但.

然而,这让我很焦虑,所以我尝试了这个:

while (!bool) {
    console.log("Hi");
    var bool = true;
}
Run Code Online (Sandbox Code Playgroud)

这甚至更奇怪.当涉及条件表达式时,它也是同样的问题:在评估条件之后,在循环体的范围内创建bool.其次,bool经常设置为true,但代码仍然执行一次,换句话说,Hi正在打印一次.

我很困惑,希望得到一些帮助.;)

lon*_*day 5

这是Javascript的一个小怪癖.要记住的关键是,在Javascript中,变量不一定是在var x =出现的代码中创建的.它们始终位于范围的顶部.这意味着在包含它们的函数的开头,或者全局范围的顶部,如果这是我们正在处理的范围.这称为提升.

所以你的代码可能如下所示:

function doStuff() {
    while (!bool) {
        console.log("Hi");
        var bool = true;
    }
}
Run Code Online (Sandbox Code Playgroud)

但它会像这样运行:

function doStuff() {
    var bool = undefined;
    while (!bool) {
        console.log("Hi");
        bool = true;
    }
}
Run Code Online (Sandbox Code Playgroud)

(请记住,Javascript中没有块范围这样的东西.)

第一次boolundefined.!undefined是的true,所以有条件的通过.之后,booltrue,所以条件失败.input在你的第一个例子中,它是一个类似的故事.

无论在何处声明,变量将始终在范围的最顶部创建.出于这个原因,有时建议将变量声明在范围的顶部,因为这是Javascript认为它们的位置.这可以防止像你引用的那样的惊喜.