为何如下JavaScript代码执行后控制台输出结果为1?
为什么这段JavaScript代码执行后控制台输出1?
先看代码:
var a { a = 1 function a() {} a = 3 } console.log(a) // 1
核心原因:块级函数声明的特殊提升与绑定规则
在ES2015(ES6)及以后版本中,块级作用域({}包裹的区域)内的函数声明有特殊处理逻辑,具体执行步骤拆解如下:
全局作用域初始化
全局的var a声明了一个全局变量a,初始值为undefined。进入块级作用域时的处理
块内的function a(){}会被提升到块的顶部,同时:- 在块作用域内部创建一个专属的
a绑定(类似let声明的块级变量),初始值为这个函数对象。 - 同步把全局的
a设置为这个函数对象,此时全局a的值是function a(){}。
- 在块作用域内部创建一个专属的
执行
a = 1
这里的a指向块内的专属绑定,赋值后块内的a变为1,引擎会同步更新全局的a,所以全局a的值也变成1。执行
function a(){}
这行是函数声明的实际位置,引擎会把块内的专属a重新赋值为这个函数对象,但不会再同步更新全局的a。此时块内的a变回函数,但全局a仍保持1。执行
a = 3
这个操作仅修改块内的专属a,赋值为3,和全局的a无关,全局a还是1。块级作用域执行结束
块内的专属a绑定被销毁,全局的a保留之前的1,所以最后console.log(a)输出1。
内容的提问来源于stack exchange,提问作者Agility6
相关产品推荐
相关产品推荐

