在执行学习JavaScript 代码执行过程中,我们学习了很多 ECMA 文档的术语:
- 执行上下文栈:Execution Context Stack ,用于执行上下文的栈结构
- 执行上下文:Execution Context ,代码在执行之前会先创建对应的执行上下文
- 变量对象: Variable Object ,上下文关联的 VO 对象,用于记录函数和变量声明;
- 全局对象:Global Object ,全局执行上下文关联的 VO 对象;
- 激活对象:Activation Object ,函数执行上下文关联的 VO 对象;
- 作用域链:scope chain ,作用域链,用于关联指向上下文的变量查找
在新的ECMA代码执行描述中(ES5以及之上),对于代码的执行流程描述改成了另外的一些词汇:
- 基本思路是相同的,只是对于一些词汇的描述发生了改变;
新的js执行原理图
词法环境(Lexical Environments)
词法环境是一种规范类型,用于在词法嵌套结构中定义关联的变量、函数等标识符;
- 一个词法环境是由环境记录(Environment Record)和一个外部词法环境(oute;r Lexical Environment)组成;
- 一个词法环境经常用于关联一个函数声明、代码块语句、try-catch语句,当它们的代码被执行时,词法环境被创建出来;
执行一个代码,通常会关联对应的词法环境;执行上下文会关联LexicalEnvironment和VariableEnvironment
- LexicalEnvironment用于处理let、const声明的标识符:
- VariableEnvironment用于处理var和function声明的标识符:
环境记录(Environment Record)
在这个规范中有两种主要的环境记录值:声明式环境记录和对象环境记录。
- 声明式环境记录:声明性环境记录用于定义ECMAScript语言语法元素的效果,如函数声明、变量声明和直接将标识符绑定与ECMAScript语言值关联起来的Catch子句。
- 对象式环境记录:对象环境记录用于定义ECMAScript元素的效果,例如WithStatement,它将标识符绑定与某些对象的属性关联起来。