今天看到一个js的问题,想了好久之后不得其解,到晚上才发现了问题所在,题目是这样的:
if(!("a" in window)){
var a=1;
}
alert(a);
想必大家应该看到过这个题目,他的正确答案是<code>1</code>.
我的思考过程如下:
首先在js里边有个hoist机制,也就是变量和函数声明提升机制。根据我之前的理解。
第一步,if语句没起到隔离作用域的作用,变量a还是声明在全局的。所以接下来就要看判断条件
<code>!("a" in window)</code>是否成立了,他决定着变量a是否被被赋值。
第二步,接下来我们看<code>!("a" in window)</code>是否成立,注意======,我也就是在这里犯迷糊了,此处开始是错误的=========
我开始的时候想的是"a" 是一个字符串,如果他之前在被声明为全局变量了,那他应该存在于window对象里的,
从事实上推断,<code>"a" in window</code>应该是<code>true</code>,那么这样赋值语句才会没有起作用,从而弹出来的是 1.但是为什么<code>"a" in window</code>是true呢?字符串“a" 在之前从未出现过,所以就开始瞎想了,可能是条件语句里的类型转换,也查到了很重要的资料JavaScript真值表,不过对于此题还是一无所获
。==========
后来才想起来"a" in window 指的应该是判断window对象里边是否有a这个属性,就像for-in-obj 还有obj[name]一样,问题就这样解决了。应为a被声明为全局变量的,相当于window.a。