You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

为何如下JavaScript代码执行后控制台输出结果为1?

为什么这段JavaScript代码执行后控制台输出1?

先看代码:

var a
{
  a = 1
  function a() {}
  a = 3
}
console.log(a) // 1

核心原因:块级函数声明的特殊提升与绑定规则

在ES2015(ES6)及以后版本中,块级作用域({}包裹的区域)内的函数声明有特殊处理逻辑,具体执行步骤拆解如下:

  1. 全局作用域初始化
    全局的var a声明了一个全局变量a,初始值为undefined。

  2. 进入块级作用域时的处理
    块内的function a(){}会被提升到块的顶部,同时:

    • 在块作用域内部创建一个专属的a绑定(类似let声明的块级变量),初始值为这个函数对象。
    • 同步把全局的a设置为这个函数对象,此时全局a的值是function a(){}。
  3. 执行a = 1
    这里的a指向块内的专属绑定,赋值后块内的a变为1,引擎会同步更新全局的a,所以全局a的值也变成1。

  4. 执行function a(){}
    这行是函数声明的实际位置,引擎会把块内的专属a重新赋值为这个函数对象,但不会再同步更新全局的a。此时块内的a变回函数,但全局a仍保持1。

  5. 执行a = 3
    这个操作仅修改块内的专属a,赋值为3,和全局的a无关,全局a还是1。

  6. 块级作用域执行结束
    块内的专属a绑定被销毁,全局的a保留之前的1,所以最后console.log(a)输出1。

内容的提问来源于stack exchange,提问作者Agility6

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.14 16:20:44