JS 底层探究--执行上下文

先明确:什么是执行上下文?

可以把它理解成函数运行的专属 "工作空间"。 每次调用函数,JS 引擎都会给这个函数单独开一个 "房间":

  • 房间里有:变量对象、作用域链、this
  • 函数在这个房间里运行
  • 运行结束,房间销毁

一、创建阶段(最核心!调用函数立刻执行)

时机 :函数被调用 → 代码一行一行执行之前 核心任务:三件事,只定义、不赋值

1. 生成变量对象(Variable Object)

变量对象是存放当前上下文所有变量 / 函数的容器

分三步:

  1. 收集函数的形参 → 赋值为 undefined
  2. 扫描函数声明直接把函数体赋值进去(函数提升)
  3. 扫描变量声明 → 只声明,赋值为 undefined(变量提升)

重点:函数声明优先级 > 变量声明

2. 确定作用域链(Scope Chain)

作用域链 = 当前变量对象 + 所有父级执行上下文的变量对象

作用:保证变量、函数的有序访问(先找自己,找不到往上找)

3. 绑定 this

根据调用方式确定 this 指向:

  • 普通函数调用 → window/global
  • 对象方法调用 → 该对象
  • 构造函数 → 实例对象
  • 箭头函数 → 继承外层 this

二、执行阶段(代码逐行运行)

时机 :创建阶段完成后 核心任务

  1. 把变量对象变成活动对象
  2. 逐行执行代码:赋值、运算、调用函数
  3. 执行完毕 → 上下文销毁

三、总结

  1. 创建阶段 :搭架子 → 变量undefined、函数就绪、作用域链 + this 确定
  2. 执行阶段:跑代码 → 变量赋值、函数执行
  3. 顺序永远是:先创建,后执行
相关推荐
独孤九剑打醒他8 分钟前
从“铁块一直在辐射电磁波“到EUV光源:微波等离子体MPP架构全链路推演
前端·架构·硬件工程
光电的一只菜鸡14 分钟前
高通tuning中eis需要调什么
java·开发语言·前端
兔兔兔兔116 分钟前
记录C++ 12
开发语言·c++
丰锋ff33 分钟前
基于 Qt 的智能门禁系统(三)
开发语言·qt
quweiie44 分钟前
腾讯云视频点播-web上传视频
前端·音视频·腾讯云·上传视频·腾讯云视频点播
消费知多少1 小时前
解析勤策签约大西洋焊接费用核销实践案例
开发语言·c#
API快乐传递者1 小时前
1688 跨境电商 API 接口实战指南:从寻源到代采的全链路技术方案
java·前端·数据库
马可家的菠萝1 小时前
收藏不是终点:一个真正有用的个人知识库,至少要完成“收集 → 理解 → 行动”
前端·后端·架构
LabVIEW开发1 小时前
LabVIEW按段拆分TDMS文件的格式边界与重构
开发语言·数据库·重构·labview·labview知识·labview功能·labview程序
明月_清风2 小时前
看完 DSH 文档后,我总结了这 7 个关键点
前端·后端·deepseek