一个有意思的js块作用域问题
1.问题 首先把问题放出来,昨天看了一个网友发的一个问题,然后跟我同事一起研究了一下,没找出来是为什么,然后我回来一直在想为什么,然后各种找资料研究,从各个方面找为什么,比如js上下文,作用域,js垃圾回收,堆栈调用情况等等。 2.js断点调试找答案 首先如果不看上面的图,以你现在知道的js知识,你觉得打印出来应该是什么。第二张图其实打印出来的结果在意料之中,原因就是函数声明提升,没问题,但是第一张图为什么呢?这里可以发散一下思维,比如说是不是在块作用域中,变量和函数之间存在某种互相覆盖的问题啊,或者说先在块中声明的会被挂载到全局的window对象下面,后面声明的就挂载不上去了,并且不会覆盖,然后可以把代码稍微改改,验证一下你的思想,很有意思。然后下面我们断点调试看下: 首先进花括号一步都没走的时候,但是a和b已经挂载到全局变量的window对象下面了,这就说明代码块中隐式生命的变量是全局变量,代码相当于这样: 此时我们再看a在 块作用域中就已经是方法了,注意此时我 function a(){} 这段代码还没走完呢,这就说明函数声明在js解析 (注意是解析不是执行)的时候代码块中被提升到了代码块顶部,进花括号的那一刻起,函数就已经被声明了,我们再往下面一步走 此时a不管在 块作用域还是 全局作用域中都变成了a函数,那这里是都可以理解为运行上面一行代码