【问题标题】:What is the difference between the specification types Environment Record (Lexical Environment) and Reference, in ECMAScript?ECMAScript 中的规范类型环境记录(词法环境)和参考有什么区别?
【发布时间】:2019-01-10 14:31:44
【问题描述】:

阅读ECMAScript specification,似乎既是Environment RecordLexical Environment 的一个组件),又是Reference,用于确定Identifier 绑定到的变量/函数。换句话说,就是找到Identifier所代表的实际值。

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

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

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


编辑:

在接受@Bergi 的回答后,我想补充一些我没有理解的东西,以防对未来的读者有所帮助:

  1. ECMAScript 中的标识符查找总是返回 Reference 类型
    • 要解析变量/函数名,我们从8.3.2 ResolveBinding开始
    • 您将看到running execution contextLexicalEnvironment(其环境记录)首先被检查
    • 如果未找到匹配项,则向外跟随词法环境链,直到找到(或未找到)匹配项
    • 链结束于global environment,其外部环境为null
    • 找到匹配项后,将返回 Reference 类型,其 base value 设置为环境记录中匹配的名称的值
    • 如果未找到匹配项,则返回带有 base valueundefinedReference
    • 因此,标识符查找总是需要检查环境记录并在最后返回 Reference 类型
  2. ReferenceGetValue在评估Expression 之后完成的
    • GetValue(ref) 用于引用以返回其 base value
    • 在规范中搜索“GetValue(”,您会发现它在评估某种Expression 之后发生
    • “评估Expression”意味着查看ReferenceExpression 返回的结果
    • 由此我们可以得出结论,Expressions 总是计算为 Reference(一个值)
    • 注意:Expression 包括范围广泛的其他产生式,例如 IdentifierReference,它深深嵌套在 Expression production

【问题讨论】:

    标签: javascript ecmascript-6 ecmascript-2017


    【解决方案1】:

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

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

    要查找一个值,例如在console.log(value) 中,您可以只在当前词法环境中查找名称“值”并让标识符对其进行评估。但是要分配一个值,就像在value = 5 中一样,您需要将标识符评估为代表可以存储数字的位置的东西——这就是Reference 类型。它包含一个基础——(词法环境的)记录——和一个标识符——特定变量的名称。它可以取消引用到值 (GetValue),也可以为其分配一个新值 (PutValue)。

    【讨论】:

    • 只是感兴趣:在哪种情况下,Reference 的基值未定义?
    • @JonasW。 undefined.property,大概?
    • 然后GetValue 会失败吗?
    • @JonasW.是的,完全正确
    • @Magnus 记录和名字,是的。
    猜你喜欢
    • 2021-07-25
    • 2016-10-25
    • 2020-06-22
    • 2019-01-29
    • 1970-01-01
    • 1970-01-01
    • 2016-06-16
    • 2019-03-06
    • 2011-01-22
    相关资源
    最近更新 更多