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

标签 javascript ecmascript-6 ecmascript-2017

阅读ECMAScript specification , 似乎都是 Environment Record (Lexical Environment 的一个组成部分)和 Reference用于确定 Identifier 绑定(bind)到哪个变量/函数。换句话说,找到标识符所代表的实际值。

我注意到 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 Record 的执行上下文环境(由running execution contextLexicalEnvironment 组件给出)。


编辑:

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

  1. ECMAScript 中的标识符查找总是返回一个Reference 类型
    • 要解析变量/函数名称,我们从 8.3.2 ResolveBinding 开始
    • 您将看到首先检查运行的执行上下文LexicalEnvironment(它的环境记录)
    • 如果没有找到匹配项,则词法环境链向外移动,直到找到(或没有)匹配项为止
    • 链结束于全局环境,它的外部环境为null
    • 一旦找到匹配项,就会返回一个Reference 类型,它的base value 设置为匹配的Environment Record 中名称的值
    • 如果未找到匹配项,则返回基值未定义引用
    • 因此,标识符查找总是需要检查环境记录并在末尾返回Reference类型
  2. ReferenceGetValue在评估 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/

相关文章:

java - 从 java 代码调用 javascript(jQuery/Envjs)

javascript - 如何根据 bool 属性对对象数组进行排序?

javascript - Guardian API,JSON解析jquery/javascript

javascript - 组件Vuejs2声明$data obj以在组件之间共享数据

javascript - 异步加载在这种情况下不起作用

javascript - 使用 ES6 语法和动态路径导入模块

javascript - ES6 传递函数作为参数示例

javascript - 循环等待 API 响应

javascript - 将 async/await 与 forEach 循环结合使用

javascript - 将 async/await 与 forEach 循环一起使用