Синтаксис идентификаторов
IdentifierReference [Yield, Await] :
[~Yield] yield
[~Await] await
BindingIdentifier [Yield, Await] :
yield
await
LabelIdentifier [Yield, Await] :
[~Yield] yield
[~Await] await
IdentifierName но не ReservedWord
yield и await разрешены как BindingIdentifier в грамматике и запрещены статической семантикой ниже, чтобы запретить автоматическую вставку точки с запятой в таких случаях, как
let
await 0;
Статическая семантика: ранние ошибки
BindingIdentifier : Identifier
- Это синтаксическая ошибка, если код, соответствующий этому продукту, содержится в коде строгого режима, а StringValue идентификатора Identifier — «arguments» или «eval».
IdentifierReference : yield
BindingIdentifier : yield
LabelIdentifier : yield
- Это синтаксическая ошибка, если код, соответствующий этому продукту, содержится в коде строгого режима.
IdentifierReference : await
BindingIdentifier : await
LabelIdentifier : await
- Это синтаксическая ошибка, если целевой символ синтаксической грамматики является модулем — Module.
BindingIdentifier [Yield, Await] : yield
- Если у этой продукции есть параметр [Yield], это является синтаксической ошибкой.
BindingIdentifier [Yield, Await] : await
- Если у этой продукции есть параметр [Await], это является синтаксической ошибкой.
IdentifierReference [Yield, Await] : Identifier
BindingIdentifier [Yield, Await] : Identifier
LabelIdentifier [Yield, Await] : Identifier
- Это синтаксическая ошибка, если эта продукция имеет параметр [Yield] и StringValue of Identifier имеет значение «yield«.
- Это синтаксическая ошибка, если эта продукция имеет параметр [Await], а StringValue идентификатора — «await«.
Identifier : IdentifierName но не ReservedWord
Это синтаксическая ошибка, если эта фраза содержится в коде строгого режима, а StringValue для IdentifierName является: «implements«, «interface«, «let«, «package«, «private«, «protected«, «public«, «static» или «yield«.
Это синтаксическая ошибка, если целевым символом синтаксической грамматики является Module, а StringValue для IdentifierName является «await».
Это синтаксическая ошибка, если StringValue для IdentifierName является тем же значением String, что и StringValue любого ReservedWord, за исключением yield или await.
StringValue из IdentifierName нормализует любые escape-последовательности Unicode в IdentifierName, поэтому такие escape-последовательности нельзя использовать для записи идентификатора Identifier, последовательность кодовых точек которого такая же, как и в ReservedWord.
Статическая семантика: StringValue
1. Пусть idText будет исходным текстом, совпадающим с именем IdentifierName. 2. Пусть idTextUnescaped будет результатом замены любых вхождений \ UnicodeEscapeSequence в idText кодовой точкой, представленной UnicodeEscapeSequence. 3. Вернуть ! CodePointsToString(idTextUnescaped).
IdentifierReference : yield
BindingIdentifier : yield
LabelIdentifier : yield
1. Вернуть "yield".
IdentifierReference : await
BindingIdentifier : await
LabelIdentifier : await
1. Вернуть "await".
Identifier : IdentifierName но не ReservedWord
1. Верните StringValue для IdentifierName.
1. Верните конкатенацию строк 0x0023 (ЗНАК ЧИСЛА - NUMBER SIGN) и StringValue для IdentifierName.
Семантика времени выполнения: Оценка
IdentifierReference : Identifier
1. Вернуть ? ResolveBinding(StringValue из Identifier).
IdentifierReference : yield
1. Вернуть ? ResolveBinding("yield").
IdentifierReference : await
1. Вернуть ? ResolveBinding("await").
Результатом вычисления IdentifierReference всегда является значение типа Reference.
В нестрогом коде ключевое слово yield может использоваться в качестве идентификатора. Оценка IdentifierReference разрешает привязку yield, как если бы это был идентификатор Identifier. Ограничение Early Error гарантирует, что такая оценка может выполняться только для нестрогого кода.
Информационные ссылки
Стандарт ECMAScript — Раздел «13.1 Identifiers» — https://tc39.es/ecma262/#sec-identifiers