Javascript 变量声明是否提升到if范围块的顶部?

Javascript 变量声明是否提升到if范围块的顶部?,javascript,Javascript,当在if块范围内使用关键字var声明的变量发生提升时,(var x;)是否提升到当前if块的顶部?或者在这种情况下,到达全局范围的顶部? 假设我们直接在全局范围内编写了以下代码 if (true) { some code; var x = 1; } 简单的回答是,是的,申报单是悬挂的,但不是放在大楼的顶部。它被提升到全球水平。但分配的位置不会改变 这是很难测试的,因为未声明的变量和已声明的变量都会产生类型的somevar或未定义的 var-myVar; log('typeof m

当在if块范围内使用关键字var声明的变量发生提升时,(var x;)是否提升到当前if块的顶部?或者在这种情况下,到达全局范围的顶部? 假设我们直接在全局范围内编写了以下代码

if (true) {
   some code;
   var x = 1;
}

简单的回答是,是的,申报单是悬挂的,但不是放在大楼的顶部。它被提升到全球水平。但分配的位置不会改变

这是很难测试的,因为未声明的变量和已声明的变量都会产生
类型的somevar
未定义的

var-myVar;
log('typeof myVar');
console.log(myVar的类型);
log('typeof notDeclared');
console.log(未声明的类型)绝对正确

//已吊装
如果(真){
x=1;
控制台日志(x,类型x);
var x;
}
//没有做你认为会做的事情,作业没有移动,只是声明。
如果(真){
控制台日志(y,y类型);
变量y=1;

}
根据您的示例,当使用
var
(或完全忽略定义键,例如仅
x=1
)时,它将被提升到最近的范围,在您的示例中,该范围是全局范围(
窗口

如果它将被包装在一个函数中,那么该函数将是最近的作用域

函数a(){
如果(真){
var x=1;
}
console.log(x)//1
console.log(window.x)//未定义
}
()

console.log(x)//抛出错误(x未定义)
它不是这样工作的。。。在if语句之前,尝试为“未声明”实体myvar赋值,您不应该看到错误。@JasonB谢谢,我的第一个答案不太正确。我认为编辑的版本是正确的。很好!很好的研究很好的例子,但更具体地说,上面例子中的(var x)是提升到(if块)范围的顶部还是全局范围的顶部?提升到范围的顶部,即函数或脚本的顶部,而不是块、开关,也不是if。问得好。看起来@Todd Chaffee在他的回答中已经解决了这个问题。