Der Code lautet wie folgt:
if(!("a" in window)){
var a = 1;
}
alert(a);
Ich habe die entsprechende Erklärung gesehen. Der Grund dafür ist, dass die Variablendeklaration gefördert wird, die Variablenzuweisung jedoch nicht, aber ich verstehe es immer noch nicht. Wurde der Code im if-Anweisungsblock ausgeführt? Wenn nicht, welche Anweisung hat dazu geführt, dass die Variable heraufgestuft wurde? Bei der Ausführung sollte der Wert von a 1 sein.
Ich habe versucht, den folgenden Code in die Konsole einzugeben
alert(b)//报错,b未被定义;
if (2>1){
var b=1;
}
alert(b)//1
if("a" in window)
var a = 1;
alert(a);
问题1
没有执行
问题2
变量提升不是语句造成的,实在js引擎编译你的js代码时进行的!
啥原理?
以chrome为例,首v8引擎碰到你的代码,会把它变成这样:
然后因为a已经声明了 所以!("a" in window) 始终为假!if内语句不执行!
所以alert(a)时 a没有值
我用你的代码结果弹出1
变量声明提升后变成一下代码
变量声明提升后,先定义了a,之后进入if语句,a是window的属性,取反之后变为false,所以if语句里面的代码没有执行,最后弹出来的就是
undefined
var a;
if(!(a in window)){
}
alert(a);
if不成立里面的代码当然不会执行了 所以a是undefined没毛病
在JavaScript引擎解析这段代码的时候,会解析成如下样子:
因为你的
a
已经声明为window的属性了,故if条件始终为假,a未被赋值即为undefined.