我提前道歉,这可能以前在 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 范围这样的东西。)
第一次,bool
是undefined
。 !undefined
为 true
,因此条件通过。之后,bool
为 true
,因此条件失败。您的第一个示例中的 input
与此类似。
无论在哪里声明,变量总是在作用域的最顶端创建。出于这个原因,有时建议将变量声明在作用域的顶部作为良好做法,因为这是 Javascript 认为它们所在的位置。这样可以防止像您引用的那样出现意外。
关于JavaScript 条件执行和变量作用域,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14697193/