-
Notifications
You must be signed in to change notification settings - Fork 2
Open
Description
执行上下文
程序本质上是一个状态机,所谓的状态就是 变量,
那么,js 代码在执行的过程中,从哪里读写数据?
答案就是执行上下文,执行上下文可以理解成一个特殊的对象,该对象存储了 代码执行过程中需要读写的 状态
在说明执行上下文之前,需要说明一个很重要的概念:
- 声明
- 读写
声明和读写其实是两件事,但由于我们经常写下面这样的代码:
var bar = 1
实际上对于解析器而言,这行代码另有乾坤,需要抛出的一个基本结论是:
在js中,代码执行前对变量进行 声明, 执行过程中才对变量进行读写
而变量的声明其实就是执行上下文创建的过程
执行上下文的创建过程
执行上下文的分类:
- 全局执行上下文
- 函数执行上下文
- eval("")
执行上下文的作用是: 正在执行的代码在当前执行上下文中查找需要的变量
全局执行上下文的组成:
- 全局对象(window,global)
- 全局scope
- thisBinding
生成全局执行上下文的步骤:
-
ECS压入对象
-
处理声明
- 找到所有非函数的
var声明 - 找多所有 顶级
函数声明 - 找到顶级
let,const,class声明
- var, function 声明的变量,会在
全局对象中 - let, const, class 声明的变量会在全局 scope 中
在全局执行上下文中查找变量的优先级:
全局scope > 全局对象 - 找到所有非函数的
-
检查重复定义
- 全局scope中是否有重复声明,有则
报错 - 全局scope中是否与
全局对象重复声明,有则报错
- 全局scope中是否有重复声明,有则
-
初步赋值
var声明被赋值为 undefined- 函数声明会 创建
函数对象,然后指向该对象
-
全局scope中的变量: 不进行初始化,标记该行代码的位置
-
TDZ:scope中的变量不会进行初始化,js规定,对未初始化的变量进行引用, 会报错,也就是所谓的暂时性死区。
-
开始执行代码
问题: 为什么要是顶级的函数对象和变量声明?
Metadata
Metadata
Assignees
Labels
No labels