JavaScript 条件执行和变量作用域

标签 javascript scope conditional-statements

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

但是,我正在学习 JavaScript 并阅读了一本名为“Eloquent JavaScript”的书。我在那里找到了以下代码,它反复提示用户输入他的名字,直到他输入为止。

while (!input) {
    var input = prompt("Who are you?");
}

我只是不明白为什么这实际上有效而不是引发错误。在评估条件表达式时,那里没有名为 input 的变量。如果我理解正确,则无法进行评估,这通常会阻止进一步执行。 while 循环主体中的语句then 创建了一个名为input 的变量,但仍在执行。

然而,这让我很着急,所以我尝试了这个:

while (!bool) {
    console.log("Hi");
    var bool = true;
}

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

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

最佳答案

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

所以你的代码可能是这样的:

function doStuff() {
    while (!bool) {
        console.log("Hi");
        var bool = true;
    }
}

但是它会这样运行:

function doStuff() {
    var bool = undefined;
    while (!bool) {
        console.log("Hi");
        bool = true;
    }
}

(请记住,在 Javascript 中没有 block 范围这样的东西。)

第一次,boolundefined!undefinedtrue,因此条件通过。之后,booltrue,因此条件失败。您的第一个示例中的 input 与此类似。

无论在哪里声明,变量总是在作用域的最顶端创建。出于这个原因,有时建议将变量声明在作用域的顶部作为良好做法,因为这是 Javascript 认为它们所在的位置。这样可以防止像您引用的那样出现意外。

关于JavaScript 条件执行和变量作用域,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14697193/

相关文章:

javascript - 在内部 promise 解决之前 promise 解决

c# - 当对象超出范围时,事件处理程序会发生什么?

javascript - 回调函数内的变量作用域怎么样

Powershell 跳过数组中的元素,如果它为空

html - 当变量为负时如何更改背景颜色?

javascript - React-redux,连接函数不使用新数据更新状态

Javascript 日期验证

javascript - 如何将放大和缩小添加到 iframe 代码

python - 在 Jupyter Notebook 中使用 %%time 在连续单元格中更改变量范围

Javascript,编写 if 条件的更好方法