阅读ECMAScript specification , 似乎都是 Environment Record (Lexical Environment 的一个组成部分)和 Reference用于确定 Identifier
绑定(bind)到哪个变量/函数。换句话说,找到标识符所代表的实际值。
我注意到 Reference
的 Base value
组件可以包含 Environment Record
:
The base value component is either undefined, an Object, a Boolean, a String, a Symbol, a Number, or an Environment Record.
但是,我不清楚什么时候会使用 Reference
而不是直接从当前 Lexical 读取
(由Environment Record
的执行上下文环境running execution context
的LexicalEnvironment
组件给出)。
编辑:
接受@Bergi 的回答后,我想补充一些我不明白的事情,以防对 future 的读者有所帮助:
- ECMAScript 中的标识符查找总是返回一个
Reference
类型- 要解析变量/函数名称,我们从 8.3.2 ResolveBinding 开始
- 您将看到首先检查
运行的执行上下文
的LexicalEnvironment
(它的环境记录) - 如果没有找到匹配项,则词法环境链向外移动,直到找到(或没有)匹配项为止
- 链结束于
全局环境
,它的外部环境为null
- 一旦找到匹配项,就会返回一个
Reference
类型,它的base value
设置为匹配的Environment Record 中名称的值 - 如果未找到匹配项,则返回
基值
为未定义
的引用
- 因此,标识符查找总是需要检查环境记录并在末尾返回
Reference
类型
Reference
的GetValue
是仅在评估Expression
之后完成的GetValue(ref)
用于 Reference 以返回其base value
- 在规范中搜索“GetValue(”,您会发现它仅发生在对某种
Expression
求值之后 - “评估一个
表达式
”意味着查看一个表达式
返回的Reference
- 由此我们可以得出结论,
Expressions
的计算结果总是Reference
(一个值) - 注意:
Expression
包括范围广泛的其他产品,例如IdentifierReference
,它深深嵌套在 Expression production 下
最佳答案
环境记录是 record包含多个变量。
引用是表示可变事物的对象,例如对象的属性或单个变量。
要查找一个值,例如在 console.log(value)
中,您只需在当前词法环境中查找名称“value”,然后让标识符对其求值。但是要分配一个值,比如在 value = 5
中,您需要标识符来评估代表数字可以存储的位置的东西 - 这就是 Reference
类型.它包含一个基础——(词法环境的)记录——和一个标识符——特定变量的名称。它可以取消对值的引用 ( GetValue
),或者您可以为其分配一个新值 ( PutValue
)。
关于javascript - ECMAScript 中的规范类型环境记录(词法环境)和引用有什么区别?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/51660058/