ECMAScript 中的规范类型环境记录(词法环境)和引用之间有什么区别?

Mag*_*nus 5 javascript ecmascript-6 ecmascript-2017

阅读ECMAScript 规范,似乎环境记录(词法环境的组件)和引用都用于确定 anIdentifier绑定到哪个变量/函数。换句话说,找到 Identifier 所代表的实际值。

我注意到 aReferenceBase value组件可以包含Environment Record

基值组件可以是未定义的、对象、布尔值、字符串、符号、数字或环境记录。

但是,我不清楚何时使用 aReference而不是直接读取Environment Record当前的执行上下文(由s组件Lexical Environment给出)。running execution contextLexicalEnvironment


编辑:

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

  1. ECMAScript 中的标识符查找始终返回Reference类型
    • 要解析变量/函数名称,我们从8.3.2 ResolveBinding开始
    • 您将看到首先检查了running execution context's LexicalEnvironment(其环境记录)
    • 如果未找到匹配项,则向外跟踪词法环境链,直到找到匹配项(或未找到匹配项)
    • 链的末端为global environment,其外部环境为null
    • 一旦找到匹配项,Reference就会返回一个类型,该类型的base value值设置为匹配的环境记录中的名称值
    • 如果未找到匹配项,则返回Reference带有base valueof的 aundefined
    • 因此,标识符查找总是需要检查环境记录并Reference在最后返回类型
  2. Reference只有在评估之后才会GetValue完成Expression
    • GetValue(ref)用于引用以返回其base value
    • 在规范中搜索“GetValue(”,您会发现它在评估Expression某种类型后才会发生
    • “评估”Expression意味着查看Reference回报Expression
    • 由此我们可以得出结论,Expressions总是评估为a Reference(一个值)
    • 注意: AnExpression包括各种其他产生式,例如IdentifierReference,它深深嵌套在表达式产生式下

Ber*_*rgi 3

环境记录是包含多个变量的记录

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

要查找值,例如 in console.log(value),您只需在当前词法环境中查找名称“value”,然后将标识符评估为该值即可。但是要分配一个值,例如 in value = 5,您需要将标识符计算为表示可以存储数字的位置的内容 - 这就是类型Reference。它包含一个基数 - (词法环境的)记录 - 和一个标识符 - 特定变量的名称。它可以取消对值 ( GetValue) 的引用,也可以为其分配新值 ( PutValue)。