【发布时间】:2019-01-10 14:31:44
【问题描述】:
阅读ECMAScript specification,似乎既是Environment Record(Lexical Environment 的一个组件),又是Reference,用于确定Identifier 绑定到的变量/函数。换句话说,就是找到Identifier所代表的实际值。
我注意到Reference 的Base value 组件可以包含Environment Record:
基值组件要么是未定义的、一个对象、一个布尔值、一个 字符串、符号、数字或环境记录。
但是,我不清楚何时使用Reference 而不是直接从当前Lexical Environment 中读取Environment Record 的执行上下文(由running execution context 的@987654335 给出@组件)。
编辑:
在接受@Bergi 的回答后,我想补充一些我没有理解的东西,以防对未来的读者有所帮助:
- ECMAScript 中的标识符查找总是返回
Reference类型- 要解析变量/函数名,我们从8.3.2 ResolveBinding开始
- 您将看到
running execution context的LexicalEnvironment(其环境记录)首先被检查 - 如果未找到匹配项,则向外跟随词法环境链,直到找到(或未找到)匹配项
- 链结束于
global environment,其外部环境为null - 找到匹配项后,将返回
Reference类型,其base value设置为环境记录中匹配的名称的值 - 如果未找到匹配项,则返回带有
base value的undefined的Reference - 因此,标识符查找总是需要检查环境记录并在最后返回
Reference类型
-
Reference的GetValue是仅在评估Expression之后完成的-
GetValue(ref)用于引用以返回其base value - 在规范中搜索“GetValue(”,您会发现它仅在评估某种
Expression之后发生 - “评估
Expression”意味着查看Reference和Expression返回的结果 - 由此我们可以得出结论,
Expressions总是计算为Reference(一个值) - 注意:
Expression包括范围广泛的其他产生式,例如IdentifierReference,它深深嵌套在 Expression production 下
-
【问题讨论】:
标签: javascript ecmascript-6 ecmascript-2017