We read every piece of feedback, and take your input very seriously.
To see all available qualifiers, see our documentation.
Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.
Already on GitHub? Sign in to your account
程序本质上是一个状态机,所谓的状态就是 变量,
变量
那么,js 代码在执行的过程中,从哪里读写数据?
答案就是执行上下文,执行上下文可以理解成一个特殊的对象,该对象存储了 代码执行过程中需要读写的 状态
在说明执行上下文之前,需要说明一个很重要的概念:
声明和读写其实是两件事,但由于我们经常写下面这样的代码:
var bar = 1
实际上对于解析器而言,这行代码另有乾坤,需要抛出的一个基本结论是:
在js中,代码执行前对变量进行 声明, 执行过程中才对变量进行读写
而变量的声明其实就是执行上下文创建的过程
执行上下文的作用是: 正在执行的代码在当前执行上下文中查找需要的变量
ECS压入对象
处理声明
var
函数
let
const
class
全局对象
在全局执行上下文中查找变量的优先级: 全局scope > 全局对象
检查重复定义
报错
初步赋值
函数对象
全局scope中的变量: 不进行初始化,标记该行代码的位置
TDZ:scope中的变量不会进行初始化,js规定,对未初始化的变量进行引用, 会报错,也就是所谓的暂时性死区。
开始执行代码
问题: 为什么要是顶级的函数对象和变量声明?
The text was updated successfully, but these errors were encountered:
No branches or pull requests
执行上下文
程序本质上是一个状态机,所谓的状态就是
变量
,那么,js 代码在执行的过程中,从哪里读写数据?
答案就是执行上下文,执行上下文可以理解成一个特殊的对象,该对象存储了 代码执行过程中需要读写的 状态
在说明执行上下文之前,需要说明一个很重要的概念:
声明和读写其实是两件事,但由于我们经常写下面这样的代码:
var bar = 1
实际上对于解析器而言,这行代码另有乾坤,需要抛出的一个基本结论是:
在js中,代码执行前对变量进行 声明, 执行过程中才对变量进行读写
而变量的声明其实就是执行上下文创建的过程
执行上下文的创建过程
执行上下文的分类:
全局执行上下文的组成:
生成全局执行上下文的步骤:
ECS压入对象
处理声明
var
声明函数
声明let
,const
,class
声明全局对象
中在全局执行上下文中查找变量的优先级:
全局scope > 全局对象
检查重复定义
报错
全局对象
重复声明,有则报错
初步赋值
var
声明被赋值为 undefined函数对象
,然后指向该对象全局scope中的变量: 不进行初始化,标记该行代码的位置
TDZ:scope中的变量不会进行初始化,js规定,对未初始化的变量进行引用, 会报错,也就是所谓的暂时性死区。
开始执行代码
问题: 为什么要是顶级的函数对象和变量声明?
The text was updated successfully, but these errors were encountered: