如下代码:(functionA(){console.log(A);//[FunctionA]A=1;console.log(window.A);//undefinedconsole.log(A);//[FunctionA]}())可以看到注释里的输出。这也就是说A=1这一步什么都没有发生。它既没有改变A的值,也没有在window中添加新的属性。而如下代码:(functionA(){console.log(A);//undefinedvarA=1;console.log(window.A);//undefinedconsole.log(A);//1}())这个还是很好理解的,var语句被hoist到函数顶端,函数内定义了变量A但是没有赋值,所以第一个log是undefined,因为有var,并没有向global添加属性,因此window.A也是undefined。接着,functionA(){console.log(A);//[FunctionA]A=1;console.log(window.A);//1console.log(A);//1}A();不在立即执行这个函数,结果也很符合直觉,打第一个log时,函数作用域内没有找到A,因此向上层查找,找到函数A;然后A=1使得window对象多了一个属性,第二个log结果是1,第三个log显然也是1。那么问题来了,第一段代码里,A=1到底做了什么呢?
相关分类