为了账号安全,请及时绑定邮箱和手机立即绑定

请指点结果为何是undefined

请指点结果为何是undefined

qq_遁去的一_1 2018-08-02 08:30:01
if(!("a" in window)){    var a = 10;}console.log(a); // undefined
查看完整描述

3 回答

?
墨色风雨

TA贡献1853条经验 获得超6个赞

首先弄明白in运算符,可以在MDN中查看。如果指定的属性在指定的对象或其原型链中,则in 运算符返回true。

然后就是js引擎执行js语句机制了,js引擎运行时会执行三步操作,第一步是先检查你的js代码有没有低级的语法错误,第二步是预编译,第三步是根据代码顺序解释一句执行一句。

预编译就是在执行代码会把所有的变量声明和函数声明预先处理。当你写了一句var a = 1时,javascript会当成两个操作(变量声明和变量赋值):var a;和a = 1;第一句(变量声明)是在预编译中执行的,此时只是声明了a这个变量,没有赋值操作,所以此阶段a的值为undefined。等预编译结束,才开始上面的第三步解释执行js代码。

所以根据执行先后上面的代码可以分解为下面的代码:

// 先进行预编译


var a; // 此时a的值为undefined


// 预编译结束  开始解释执行代码


if(!("a" in window)){ // 变量a此时已经存在,所以!("a" in window)为false

    a = 10; // 跳过不执行  a的值还是undefined

}


console.log(a)  // undefined


查看完整回答
反对 回复 2018-08-05
?
侃侃无极

TA贡献2051条经验 获得超10个赞

由于变量提升,var a会在一开始的时候就出现,此时值为undefined,然后执行到if时,由于a已经在window中定义了,即开辟了一块内存,所以判断结果为真,然后!真就变为假,所以跳过了赋值语句,最后console的是未赋值的a,结果为undefined

查看完整回答
反对 回复 2018-08-05
?
阿晨1998

TA贡献2037条经验 获得超6个赞

因为变量提升到作用域顶部


//变量提升

var a ;


//此时 a 为全局变量  a in window 为 true


if(!("a" in window)){

 var a = 10;

}

console.log(a); // undefined


查看完整回答
反对 回复 2018-08-05
  • 3 回答
  • 0 关注
  • 1029 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信