代码如下:
if(!("a" in window)){ var a = 1; } alert(a);
我已经看过了相关解释,原因是变量声明会被提升,但是变量赋值并不会被提升,但还是不太明白。if语句块里面的代码到底有没有被执行?如果没有,变量的提升是哪条语句造成的?如果执行了,那么a的值应该就是1啊。尝试了控制台输入以下代码
alert(b)//报错,b未被定义;
if (2>1){ var b=1; } alert(b)//1
业精于勤,荒于嬉;行成于思,毁于随。
if("a" in window)var a = 1;alert(a);
没有执行
变量提升不是语句造成的,实在js引擎编译你的js代码时进行的!
以chrome为例,首v8引擎碰到你的代码,会把它变成这样:
var a; if(!("a" in window)){ a = 1; } alert(a);
然后因为a已经声明了 所以!("a" in window) 始终为假!if内语句不执行!所以alert(a)时 a没有值
我用你的代码结果弹出1
变量声明提升后变成一下代码
var a; // 这里变量声明提升了 if(!("a" in window)){ a = 1; } alert(a);
变量声明提升后,先定义了a,之后进入if语句,a是window的属性,取反之后变为false,所以if语句里面的代码没有执行,最后弹出来的就是undefined
undefined
var a;if(!(a in window)){
var a = 1;
}alert(a);if不成立里面的代码当然不会执行了 所以a是undefined没毛病
在JavaScript引擎解析这段代码的时候,会解析成如下样子:
var a ; if(!("a" in window)){ a = 1; } alert(a);
因为你的a已经声明为window的属性了,故if条件始终为假,a未被赋值即为undefined.
a
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.