代码之家  ›  专栏  ›  技术社区  ›  Magnus

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

  •  3
  • Magnus  · 技术社区  · 7 年前

    阅读 ECMAScript specification ,似乎两者都是 Environment Record (一个 Lexical Environment ),和 Reference 用于确定 Identifier 一定会的。换句话说,查找由标识符表示的实际值。

    我注意到 Reference Base value 组件可以包含 Environment Record :

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

    但是,我不清楚什么时候会用 参考 而不是执行上下文只读取 环境记录 直接脱离当前 Lexical Environment (由 running execution context LexicalEnvironment 组件)。


    编辑:

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

    1. ECMAScript中的标识符查找总是返回 参考 类型
      • 要解析变量/函数名,我们从 8.3.2 ResolveBinding
      • 你会看到 运行执行上下文 小精灵 (其环境记录)首先被检查
      • 如果未找到匹配项,则将词汇环境链向外跟踪,直到找到匹配(或不匹配)为止。
      • 链条的末端 global environment ,其外部环境为 null
      • 一旦找到匹配项 参考 返回类型,它具有 base value 设置为环境记录中与
      • 如果找不到匹配项,则 参考 用一个 基准值 属于 undefined 被退回
      • 因此,标识符查找 总是 需要检查环境记录和 参考 结束时返回的类型
    2. 参考 GetValue 只有 曾在评估 Expression
      • GetValue(ref) 用于引用以返回其 基准值
      • 在规范中搜索“GetValue(”,您将看到它 只有 在评估 表达 某种
      • “评估 表达 “意思是看什么 参考 一个 表达 回报
      • 由此我们可以得出结论 Expressions 总是评估为 参考 (a值)
      • 注:安 表达 包括许多其他产品,如 IdentifierReference ,它深深地嵌套在 Expression production
    1 回复  |  直到 7 年前
        1
  •  3
  •   Bergi    7 年前

    环境记录是 record 包含 倍数 变量。

    引用是表示可变内容的对象,如对象的属性或 单一的 变量。

    寻找价值,比如 console.log(value) 您可以在当前的词汇环境中查找“值”,并将标识符评估为该值。但是赋值,比如 value = 5 ,您需要将标识符计算为表示数字可以存储的位置的值,这是 Reference 键入。它包含一个基点-(词汇环境)的记录-以及一个标识符-特定变量的名称。它可以取消对值的引用( GetValue ),或者可以为其分配新值( PutValue ).