JS 环境记录与执行上下文

JS 环境记录与执行上下文

本文用于个人学习记录,内容参考的是 ECMA 规范,个人英语水平有限,仅供参考,如有错漏,欢迎指正

参考来源:ECMAScript® 2024 Language Specification (tc39.es)

环境记录 Environment Records

Environment Record is a specification type used to define the association of Identifiers to specific variables and functions, based upon the lexical nesting structure of ECMAScript code

环境记录是一种规范类型,用于定义标识符与特定变量和函数的关联,基于 ECMAScript 代码的词法嵌套结构

这里试着用 TS 的类型来描述,且只给出了一些必要属性(fields),不包括方法(methods),具体内容请自行参考 ECMA 规范

ts 复制代码
interface EnvRec {
  OuterEnv: EnvRec | null
}

环境记录可以分为三大类

1.声明环境记录 Declarative Environment Record

用于存放 var, const, let, class, module, import, function 声明的环境记录

ts 复制代码
interface DeclarativeEnvRec extends EnvRec {}

声明环境记录又可以细分以下几种

函数环境记录 Function Environment Record

特指在函数执行上下文中的声明环境记录

ts 复制代码
interface FunctionEnvRec extends DeclarativeEnvRec {
  ThisValue: Object | undefined
  /* 'LEXICAL' 说明函数是箭头函数 */
  ThisBindingStatus: 'LEXICAL' | 'INITIALIZED' | 'UNINITIALIZED'
  FunctionObject: Function
  /* 构造函数会用到 */
  NewTarget: Object | undefined
}

模块环境记录 Module Environment Record

特指 ESM 模块内中的声明环境记录

ts 复制代码
interface ModuleEnvRec extends DeclarativeEnvRec {}

脚本环境记录 Script Environment Record

ECMA 规范中其实并未指出脚本环境记录属不属于环境记录的子类,个人觉得其应该是属于声明环境记录的一种,与模块环境记录相对应

ts 复制代码
interface ScriptEnvRec {
  /* a Realm Record or undefined */
  Realm: Object
  /* a Script Parse Node */
  ECMAScriptCode: Object
  /* a List of Records with fields [[Specifier]](a String) and [[Module]](a Module Record) */
  LoadedModules: Array<Object>
  /* default is 'EMPTY' */
  HostDefined: string
}

2.对象环境记录 Object Environment Record

用于存放对象属性的环境记录

ts 复制代码
interface ObjectEnvRec extends EnvRec {
  /* 绑定对象 */
  BindingObject: Object
  /* 是否为 with 语句创建的 */
  IsWithEnvironment: boolean
}

3.全局环境记录 Global Environment Record

顾名思义,存放全局环境信息的记录

ts 复制代码
interface GlobalEnvRec extends EnvRec {
  OuterEnv: null
  /* 宿主环境提供的全局对象 */
  ObjectRecord: ObjectEnvRec
  /* 全局 this 的值 */
  GlobalThisValue: Object | undefined
  /* 在全局上下文的声明环境记录 */
  DeclarativeRecord: DeclarativeEnvRec
  /* 函数,生成器,var 变量的名称列表 */
  VarNames: Array<string>
}

私有环境记录 Private Environment Record

私有环境记录并不属于环境记录

ts 复制代码
interface PrivateEnvRec {
  OuterPrivateEnvironment: PrivateEnvRec | null
  Names: Array<string>
}

执行上下文 Execution Context

ECMA 规范给出的定义:

An execution context is a specification device that is used to track the runtime evaluation of code by an ECMAScript implementation. At any point in time, there is at most one execution context per agent that is actually executing code.

这个 "specification device",不知道怎么翻译比较好......

我觉得其实按字面意思理解就行,执行上下文,不就是代码执行期间,当前环境的上下文信息嘛

还是用 TS 的类型来描述执行上下文:

ts 复制代码
interface ExecutionContext {
  /* 代码执行状态 */
  CodeEvaluationState: unknown
  /* 如果是函数执行上文,则是该函数,否则为 null */
  Function: Function | null
  /* 关联代码访问 js 资源的 Realm Record */
  Realm: unknown
  /* 如果是全局执行上下文,浏览器环境下,根据 Script 标签的 type 属性决定 */
  ScriptOrModule: ModuleEnvRec | ScriptEnvRec | null
  /* 词法环境,存放非 var 声明的环境记录 */
  LexicalEnvironMent: DeclarativeEnvRec
  /* 变量环境,存放 var 声明的环境记录 */
  VariableEnvironment: DeclarativeEnvRec
  /* 存放私有变量声明的环境记录 */
  PrivateEnvironment: PrivateEnvRec | null
  /* 生成器 */
  Generator: unknown
}
相关推荐
用户9385156350711 小时前
从零构建《天龙八部》知识库:EPUB 加载→文本分割→向量嵌入→Milvus 存储→RAG 问答,一条链路打通
javascript·人工智能·全栈
柚yuzumi13 小时前
变量明明定义了,为什么访问不到?深入理解 JavaScript 作用域
javascript
何时梦醒13 小时前
React + TypeScript + Vite 实战:从零构建 Color Picker 应用
前端·javascript·架构
Highcharts.js13 小时前
基于Highcharts开发的OHLC 股票K线图完全指南
javascript·信息可视化·echarts·数据可视化·highcharts·ohlc
默_笙13 小时前
😋 我让 DeepSeek-R1 在浏览器本地跑了起来,后端同事说"你认真的?"
前端·javascript
JasonMa15314 小时前
从零搭建一个微信小程序活动管理平台(一):架构设计与技术选型
javascript·微信小程序·node.js
sugar__salt15 小时前
Vue3 核心特性深度解析:v-model、ref 属性与 nextTick 完全指南
前端·javascript·vue.js·前端框架·vue
古韵15 小时前
你的 uni-app 分页,一个 hook 搞定竞态和加载
javascript·vue.js·uni-app
成都渲染101云渲染666617 小时前
Blender渲染时,纯CPU渲染的设置教程
前端·javascript·blender
多加点辣也没关系17 小时前
JavaScript|第30章:事件机制
开发语言·javascript