Skip to content
New issue

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

【核心篇】执行上下文 #3

Open
c0sc0s opened this issue Dec 31, 2022 · 0 comments
Open

【核心篇】执行上下文 #3

c0sc0s opened this issue Dec 31, 2022 · 0 comments

Comments

@c0sc0s
Copy link
Collaborator

c0sc0s commented Dec 31, 2022

执行上下文

程序本质上是一个状态机,所谓的状态就是 变量

那么,js 代码在执行的过程中,从哪里读写数据?

答案就是执行上下文,执行上下文可以理解成一个特殊的对象,该对象存储了 代码执行过程中需要读写的 状态

在说明执行上下文之前,需要说明一个很重要的概念:

  • 声明
  • 读写

声明和读写其实是两件事,但由于我们经常写下面这样的代码:

var bar = 1

实际上对于解析器而言,这行代码另有乾坤,需要抛出的一个基本结论是:

在js中,代码执行前对变量进行 声明, 执行过程中才对变量进行读写

而变量的声明其实就是执行上下文创建的过程

执行上下文的创建过程

执行上下文的分类:

  • 全局执行上下文
  • 函数执行上下文
  • eval("")

执行上下文的作用是:  正在执行的代码在当前执行上下文中查找需要的变量

全局执行上下文的组成:

  • 全局对象(window,global)
  • 全局scope
  • thisBinding

生成全局执行上下文的步骤:

  1. ECS压入对象

  2. 处理声明

    1. 找到所有非函数var 声明
    2. 找多所有 顶级函数声明
    3. 找到顶级 let, const, class声明
    • var, function 声明的变量,会在 全局对象
    • let, const, class 声明的变量会在全局 scope 中

    在全局执行上下文中查找变量的优先级:
    全局scope > 全局对象

  3. 检查重复定义

    1. 全局scope中是否有重复声明,有则 报错
    2. 全局scope中是否与 全局对象 重复声明,有则 报错
  4. 初步赋值

    1. var 声明被赋值为 undefined
    2. 函数声明会 创建 函数对象 ,然后指向该对象
  5. 全局scope中的变量: 不进行初始化,标记该行代码的位置

  6. TDZ:scope中的变量不会进行初始化,js规定,对未初始化的变量进行引用, 会报错,也就是所谓的暂时性死区。

  7. 开始执行代码

问题: 为什么要是顶级的函数对象和变量声明?

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
None yet
Projects
None yet
Development

No branches or pull requests

1 participant