Javascript JS引擎如何处理条件块中的变量声明?

Javascript JS引擎如何处理条件块中的变量声明?,javascript,Javascript,全部: 我有一个关于变量声明的问题,如果我在if块中声明一个变量,当JS引擎遇到该行时,引擎如何知道如何设置该变量 我知道这是一种糟糕的声明变量的方式,但我只是好奇JS引擎如何使用它: if( trueSituation ){ var a_variable = true; }else { var another_variable = false; } 谢谢,Javascript有一个术语叫做“变量提升”。当您的代码实际执行时,所有vars都会被拉到封闭函数的顶部: functi

全部:

我有一个关于变量声明的问题,如果我在if块中声明一个变量,当JS引擎遇到该行时,引擎如何知道如何设置该变量

我知道这是一种糟糕的声明变量的方式,但我只是好奇JS引擎如何使用它:

if( trueSituation ){
    var a_variable = true;
}else {
    var another_variable = false;
}

谢谢,Javascript有一个术语叫做“变量提升”。当您的代码实际执行时,所有
var
s都会被拉到封闭函数的顶部:

function foo() {
    var a_variable;
    var another_variable;
    if( trueSituation ) {
         a_variable = true;
    }else {
         another_variable = false;
    }
}
在执行
if/else
之前,您可以将
console.log(a_变量)
作为特殊值
未定义


作为旁注,ES6包含一个名为
let
的构造,它允许更传统的块作用域,但我相信它仍然将变量提升到块的顶部。

在JavaScript中,变量声明提升到其包含范围的顶部

在您的示例中,这是:

if( trueSituation ){
  var a_variable = true;
} else {
  var another_variable = false;
}
…变成这样:

var a_variable, another_variable;

if( trueSituation ){
  a_variable = true;
} else {
  another_variable = false;
}

两个变量最终都被声明,但只有一个变量根据
truecontence

变量声明的真实性被定义,这意味着代码块中的所有声明都是在代码执行之前完成的。代码的工作原理如下:

var a_variable, another_variable;

if( trueSituation ){
  a_variable = true;
} else {
  another_variable = false;
}
请注意,每次都会声明块中的所有变量,即使在执行代码时不会使用这些变量

您甚至可以将声明放在使用变量的代码之后,并放在永远不会实际执行的代码中:

if( trueSituation ){
  a_variable = true;
} else {
  another_variable = false;
}

if (false) {
  var a_variable, another_variable;
}

谢谢你的解释。我有点想知道那个瓦里贝尔要吊到什么高度?如果没有功能,它会到达第一个功能范围还是全局范围scope@Kuan:
var
提升至功能范围,
提升至阻塞scope@Bergi谢谢,我想知道是否没有定义函数,是否有多个标签,它是否会被提升到该标签块的范围内,或者在所有标签上都可用?@Kuan如果没有封闭功能,它将击中全局。很多库都使用IIFEs包装的原因之一。@Kuan脚本标记都共享相同的顶级全局作用域。这就是为什么当您将jQuery作为脚本包含时,它在所有其他脚本上都可以作为$/jQuery引用。您的意思是“它如何知道如何设置该变量?”您的意思是“它如何知道如何设置该变量?”@Andreacasacia抱歉,我的打字错误。感谢您的解释,我有点想知道该变量将被提升到什么级别?如果没有函数作用域,它将到达第一个函数作用域还是全局作用域如果在函数外部,它将在全局作用域中,或者在其直接函数的作用域内。谢谢,我想知道是否没有定义函数,是否有多个标记,它会被提升到该标记块的范围内还是在所有标记中都可用?全局变量在所有
标记中都是可访问的。感谢这个例子,非常有趣,因此这意味着即使该声明从未被调用,如果此代码在函数中,我仍然将这两个变量声明为局部变量?@Kuan:是的。注意,赋值为
var a_variable=true
的声明实际上是一个声明
var a_变量和赋值
a_varaible=true
。声明被搁置,但赋值仍保留在执行的代码中。