跟朋友探讨了一道面试题,具体内容如下:
var b = 10; (function b() { b = 20; console.log(b); })();
问为什么打印出来的【变量b】 不是20?
先来看下正确结果:
是不是第一眼瞅过去觉得有点问题?
这里涉及到了一个知识点:在JS的预编译期,声明式函数将会先被提取出来,然后再按顺序执行js代码。
程序发现可直接执行的声明函数,直接执行了函数,此时 【变量b】指向的是该函数,执行到 b = 20 时,b 还在使用中,赋值失败,再 console 的时候自然就是引用的函数表达式了。
最后,函数执行结束,释放 【变量b】,再顺序执行 js 代码,此时【变量b】赋值为 10 。