В чем разница между спецификацией типов Environment Record (лексическая среда) и Reference, в ECMAScript?


Читая спецификациюECMAScript , кажется, что записьсреды (компонентлексической среды ) и ссылка используются для определения того, к какой переменной / функции привязан Identifier. Другими словами, найти фактическое значение, представленное идентификатором.

Я заметил, что компонент Reference ' s Base value может содержать Environment Record:

Компонент базового значения либо не определен, объект, логическое значение, Строка, символ, число или запись окружения.

Но мне не ясно, когда можно было бы использовать Reference вместо контекста выполнения, просто читая Environment Record прямо из текущего Lexical Environment (как задано компонентом running execution context's LexicalEnvironment).


Редактировать:

Приняв ответ @Bergi, я хотел добавить пару вещей, которые я не понял, на случай, если это поможет будущим читателям:

  1. Поиск идентификаторов в ECMAScript всегда возвращает тип Reference
    • чтобы разрешить имя переменной / функции, мы начинаем с 8.3.2 ResolveBinding
    • Вы увидите, что running execution context's LexicalEnvironment (его запись среды) сначала проверяется
    • если совпадение не найдено, то лексическая цепочка окружения следует наружу до тех пор, пока не будет найдено совпадение (или нет)
    • цепь заканчивается на global environment, которая имеет внешнюю среду null
    • Как только совпадение найдено, возвращается тип Reference, который имеет значение base value значение имени в записи среды, которое соответствует
    • если совпадение не найдено, возвращается Reference с base value из undefined
    • таким образом, поиск идентификатора всегда влечет за собой проверку записей среды и тип Reference, возвращаемый в конце
  2. Reference ' s GetValue является только когда-либо выполненным после оценки Expression
    • GetValue(ref) используется по ссылке, чтобы вернуть его base value
    • Поиск спецификации для "GetValue (" , вы увидим, что это только происходит после оценки Expression некоторого вида
    • "оценивать Expression" означает видеть, что Reference an Expression возвращает
    • из этого можно сделать вывод, что Expressions всегда вычисляется до Reference (a value)
    • Примечание: Expression включает в себя широкий спектр других производств, таких как IdentifierReference, который глубоко вложен в производство выражений
1 3

1 ответ:

Запись окружения - это запись , содержащая несколько переменных.

Ссылка-это объект, представляющий нечто изменчивое, например свойство объекта или единственную переменную.

Чтобы найти значение, как в console.log(value), вы можете просто найти имя "value"в текущей лексической среде и получить идентификатор, соответствующий этому. Но чтобы присвоить значение, как в value = 5, вам нужен идентификатор для оценки чего-то, что представляет местоположение где номер может быть сохранен-и это тип Reference. Он содержит базу-запись (лексической среды) - и идентификатор-имя конкретной переменной. Его можно либо разыменовать на значение (GetValue), или вы можете присвоить ему новое значение(PutValue).