ECMAScript 中的规范类型环境记录(词法环境)和参考有什么区别?

What is the difference between the specification types Environment Record (Lexical Environment) and Reference, in ECMAScript?

读取ECMAScript specification, it seems both an Environment Record (a component of a Lexical Environment), and a Reference用于确定Identifier绑定到哪个变量/函数。换句话说,找到标识符所代表的实际值。

我注意到 ReferenceBase 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 中直接读取 Environment Record 的执行上下文(由running execution contextLexicalEnvironment 组件)。


编辑:

接受@Bergi 的回答后,我想补充一些我不明白的事情,以防对未来的读者有所帮助:

  1. ECMAScript 中的标识符查找总是 return 是 Reference 类型
    • 要解析 variable/function 名称,我们从 8.3.2 ResolveBinding
    • 开始
    • 您会看到 running execution contextLexicalEnvironment(它的环境记录)首先被检查
    • 如果未找到匹配项,则词法环境链向外跟踪,直到找到(或未找到)匹配项
    • 链结束于 global environment,其外部环境为 null
    • 一旦找到匹配项,Reference 类型就会被 return 编辑,其 base value 设置为环境记录中匹配的名称值
    • 如果未找到匹配项,base valueundefinedReference 是 returned
    • 因此,标识符查找 总是 需要检查环境记录并在最后 return 编辑 Reference 类型
  2. ReferenceGetValue 在评估 Expression 之后完成的
    • GetValue(ref) 用于对 return 的引用,它的 base value
    • 搜索 "GetValue(" 的规范,您会发现它 在评估某种 Expression 之后发生
    • "Evaluating an Expression" 表示看到 ReferenceExpression returns
    • 由此我们可以得出结论,Expressions 总是求值为 Reference(一个值)
    • 注意:Expression 包括范围广泛的其他产品,例如 IdentifierReference,它深深嵌套在 Expression production

环境记录是 record 包含 多个 变量。

引用是表示可变事物的对象,例如对象的 属性 或 单个 变量。

要查找一个值,例如 console.log(value),您只需在当前词法环境中查找名称 "value",然后让标识符求值为该值。但是要分配一个值,比如在 value = 5 中,您需要标识符来评估代表数字可以存储的位置的东西 - 这就是 Reference 类型。它包含一个基础——(词法环境的)记录——和一个标识符——特定变量的名称。它可以被取消引用到值 (GetValue), or you can assign a new value to it (PutValue).