以下代码为什么输出为“undefined”?

代码如下:

if(!("a" in window)){
    var a = 1;
}
alert(a);

我已经看过了相关解释,原因是变量声明会被提升,但是变量赋值并不会被提升,但还是不太明白。if语句块里面的代码到底有没有被执行?如果没有,变量的提升是哪条语句造成的?如果执行了,那么a的值应该就是1啊。
尝试了控制台输入以下代码

alert(b)//报错,b未被定义;
if (2>1){
    var b=1;
}
alert(b)//1
阅读 3.7k
6 个回答

if("a" in window)
var a = 1;
alert(a);

if(!("a" in window)){
    var a = 1;
}
alert(a);

问题1

没有执行

问题2

变量提升不是语句造成的,实在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

var a;
if(!(a in window)){

var a = 1;

}
alert(a);
if不成立里面的代码当然不会执行了 所以a是undefined没毛病

if(!("a" in window)){
    var a = 1;
}
alert(a);

在JavaScript引擎解析这段代码的时候,会解析成如下样子:

var a ;
if(!("a" in window)){
    a = 1;
}
alert(a);

因为你的a已经声明为window的属性了,故if条件始终为假,a未被赋值即为undefined.

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题