时间:2018-08-02 18:25:15

标签: javascript ecmascript-6 ecmascript-2017

读取ECMAScript specification时,似乎Environment RecordLexical Environment的组成部分)和Reference都被用来确定{{ 1}}绑定到。换句话说,找到标识符所代表的实际值。

我注意到Identifier的{​​{1}}组件可以包含Reference

  

基值部分是未定义的,对象,布尔值,   字符串,符号,数字或环境记录。

但是,我不清楚何时使用Base value而不是执行上下文,而只是从当前Environment Record中直接读取Reference(如{ {1}}的{​​{1}}组件)。


编辑:

接受@Bergi的回答后,我想补充一些我不了解的内容,以防将来对读者有帮助:

  1. ECMAScript中的标识符查找始终返回Environment Record类型
    • 要解析变量/函数名称,我们从8.3.2 ResolveBinding开始
    • 您将看到Lexical Environment的{​​{1}}(其环境记录)已被首先检查
    • 如果未找到匹配项,则将“词汇环境”链向外跟踪,直到找到(或未找到)匹配项为止。
    • 该链终止于running execution context,外部环境为LexicalEnvironment
    • 找到匹配项后,将返回Reference类型,其running execution context设置为环境记录中匹配的名称的值
    • 如果未找到匹配项,则返回LexicalEnvironmentglobal environment的{​​{1}}
    • 因此,标识符查找总是要求检查环境记录并在末尾返回null类型
  2. 在评估Reference之后,
  3. base value的{​​{1}}仅做
    • Reference用于引用,以返回其base value
    • 在规范中搜索“ GetValue(”),您会发现它仅在评估了某种undefined后才发生
    • “评估Reference”意味着查看Reference返回的GetValue
    • 由此我们可以得出结论,Expression总是求值为GetValue(ref)(一个值)
    • 注意:base value包括其他种类繁多的产品,例如Expression,这些产品深深地嵌套在Expression production

1 个答案:

答案 0 :(得分:3)

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

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

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