文章中一些名词的翻译存疑,没有查过正式的中文名称
前面都是具体过程的解释,懒得看可以直接看获取思路
有关this的取值请移步JavaScript笔记——this的取值
获取this的过程
Runtime Semantics: Evaluation
- Return ResolveThisBinding();
ResolveThisBinding()
抽象操作ResolveThisBinding通过running execution context中的LexicalEnvironment(词法环境?)来决定关键字this的绑定,执行以下两个步骤:
- Let envRec be GetThisEnvironment(); //获取当前环境
- Return envRec.GetThisBinding(); //返回当前环境记录中this的绑定
GetThisEnvironment()
抽象操作GetThisEnvironment寻找当前提供关键字this绑定的Environment Record(环境记录?),执行以下步骤:
- Let lex be the running execution context’s LexicalEnvironment.
- Repeat
a. Let envRec be lex’s EnvironmentRecord. //获取当前环境记录
b. Let exists be envRec.HasThisBinding(). //判断当前环境记录中是否建立了this绑定
c. If exists is true, return envRec. //是,则返回当前环境记录
d. Let outer be the value of lex’s outer environment reference. //否,则定义outer为outer Lexical Environment
e. Let lex be outer. //lex = outer,继续循环
步骤2的循环总是会终止,因为在environments列表中总是以拥有this的绑定的the global environment结尾
一些方法及Environment、Context的解释
GetThisBinding()
返回Environment Record的this的绑定,如果未初始化绑定则抛出ReferenceError异常
HasThisBinding()
决定一个Environment Record是否建立了this绑定,是返回true,否则返回false
Lexical Environments
词法环境(Lexical Environment)是用于定义具体变量和函数标识符的关联,基于ECMAScript代码的词法嵌套结构的规范类型。
词法环境包括词法记录(Environment Record)和对外层词法环境(outer Lexical Environment)的引用,其引用可能为空。
Lexical Environment包括几种类型:
- global environment
- module environment
- function environment
Lexical Environments和Environment Record的值仅仅是规范机制,无需对任何具体ECMAScript实现的人工程序作出响应,因此不能直接访问或操作这些值。
Environment Records
规范中有两种基本的Environment Record值,declarative Environment Records和object Environment Records
出于规范目的,可以将Environment Record看做一个抽象类,有三个具体的子类declarative Environment Record, object Environment Record, 和global Environment Record;
Function Environment Records和module Environment Records是declarative Environment Record的子类
running execution context
执行上下文(execution context)是一种用于跟踪ECMAScript实施代码运行时评估的规范设备。
在任意时刻,至多有一个执行上下文在实际执行代码,这就是running execution context。
获取思路
GetThisEnvironment()的流程: