ES2022规范中javascript执行上下文解析
关键词: 执行上下文, 环境记录
总结
想这个问题想了三天,头都炸了,太累了,直接贴图吧
规范和实现
什么是规范
- 规范: 就是对任务的详细说明
- 实现: 就是去根据这个说明实现这个任务,它是一种简称,全称就是实现任务
规范只有一种,实现的方式却可以有很多种,举个例子
现在有一个规范: 画出一个面积为100的长方形
A实现: 长为20,宽为5
B实现: 长为10, 宽为10
那么在JavaScript中有一个很出名的规范,那就是 ECMAscript
而各大浏览器厂商去实现这个规范的方式可能不同,就像长和宽不一样
需要特别说明的是这个ES规范也是在变的,就像“画出一个面积为100的长方形,边框加粗”
总之规范是任务的说明书,实现是实现任务的简称,不同人的实现可能不一样
本文的规范是 ECMAscript 第九章 # Executable Code and Execution Contexts
实现是: 谷歌浏览器对这个规范的实现
注意点
- 你需要熟练掌握es6之前的规范和实现
- 你需要熟练掌握es2015-es2019之间的规范和实现
- 这两个掘金搜一下就有很多
现在讲的是ES2022的第9章规范
规范核心解析
- es2015-es2019规范的执行上下文包含: 1. 创建LexicalEnvironment和VariableEnvironment;2. this绑定 3.创建作用域链
- es2022规范中: js代码执行时创建函数执行上下文包含三个要素:1. 创建环境记录;2. this 绑定 3. 创建作用链;
- LexicalEnvironment 和 VariableEnvironment 都属于Declarative Environment Record, 可简单认为前者保存let、const 声明的变量,后者保存var 声明的变量;代码块声明的变量也属于Declarative Environment Record,代码块语句不会新开辟执行上下文
- 全局执行上下文: script代码执行创建Global Environment Record,它包含Object Environment Record 也就是全局对象window,还包含Declarative Environment Record这个环境记录对应以前的LexicalEnvironment 用于保存let和const声明的变量;最后其中的outer,outer指的是当前环境记录的外部环境记录,这是函数实现作用域链的理论基础
- 函数执行上下文:函数被调用时创建一个新的函数环境记录,我认为这个记录本身就可以包含声明的各种变量,比如let 、const 、 var,不需要以前的LexicalEnvironment 和 VariableEnvironment ,谷歌对规范的实现也是这样做的,环境记录本就是标识符和变量的映射表
- 如果es2015-es2019的这种规范不修改,那已经很完美了;但是现在修改了,那么LexicalEnvironment 和 VariableEnvironment 就显得很多余,es规范里面有坑!!!
太累了,核心的地方已经全部讲到。
实现简析
Call Stack : 指的就是执行上下文栈 ,里面的每一行就是一个执行上下文
Scope: 你可以理解为广义的作用域,但是更精确的理解应该是作用域链,每一行的 Local, Script, Global都是一个“环境记录”; es6之前的Local, Script, Global 被称为“变量对象VO”, Local处在执行栈的最顶端,被称为"活动对象A
本人原创,转载注明出处。