js小问题

今天看到一个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。

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容

  • 1. Java基础部分 基础部分的顺序:基本语法,类相关的语法,内部类的语法,继承相关的语法,异常的语法,线程的语...
    子非鱼_t_阅读 32,053评论 18 399
  • 1 js中typeof、instanceof与constructortypeof返回一个表达式的数据类型的字符串,...
    织田信长阅读 2,325评论 0 0
  • 这是暗物质,小能熊365天写作计划第三十九天的写作内容,谢绝转载。 在进入救援艇的前一刻,罗逸紫鸟他们改变了主意,...
    黑暗物质阅读 1,781评论 0 0
  • 2017/04/11 首先,去Sourceforge下载Mingw。在安装Mingw时,package要勾选C++...
    William_An阅读 7,458评论 0 4
  • 涨一天,跌一天,如此震荡反复似乎已成为年底A股新常态,不过前期提到的贝瑞基因最近微涨。今天我还是会在文中跟大家分享...
    爱徽米粒阅读 1,066评论 0 0