作为一个大四将要毕业的学生,最近一直忙于各种面试题的总结,看到了一条比较有趣的面试题想和大家分享一下个人的心得,如果有什么不正确的地方,还麻烦大家指出哈
图一
这道题很经典也很简单,但是也很坑。怎么说呢?一些前端初学者刚入门的时候看到这种题,立刻就会想着,哎呀,JS是向下执行的,所以控制台依次输出1,1。
其实呢,并不是的。控制台会依次输出undefined,2。
图二
为什么呢?首先我们可以看到变量b是一个全局的变量,之后定义了一个匿名函数c,在函数c中会有个if条件,如果变量b不存在时,则重新定义一个局部变量b。但是我们不要忘记在javascript中是没有块级作用域的,而且变量会提升到当前作用域的顶部(这个其实也是为什么我们要在作用域的开始去定义变量,就是为了防止变量提升),所以if语句中的var b;会被提升到函数f作用域的前面,也就是上面的例子和下面的例子是等同的
图三
这时候,我们就可以很轻而易举的知道答案了。在函数c中,首先定义了个变量b,但是没有赋值(在函数内部,查找变量b的时候,如果能在内部作用域中找到的话,则返回,不能的话,则继续向外查找),所以控制台第一个输出的值是undefined,第二个的值是2。
第一次发表自己的学习心得,如果有什么不正确的地方望指出,咱学习学习!