ECMAScript | Идентификаторы (Identifiers)

ECMAScript | Идентификаторы (Identifiers)

Синтаксис идентификаторов

IdentifierReference [Yield, Await] :

Identifier

[~Yield] yield

[~Await] await

BindingIdentifier [Yield, Await] :

Identifier

yield

await

LabelIdentifier [Yield, Await] :

Identifier

[~Yield] yield

[~Await] await

Identifier :

IdentifierName но не ReservedWord

 

Примечание

yield и await разрешены как BindingIdentifier в грамматике и запрещены статической семантикой ниже, чтобы запретить автоматическую вставку точки с запятой в таких случаях, как

let
await 0;

 

Статическая семантика: ранние ошибки

BindingIdentifier : Identifier

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

IdentifierName ::

IdentifierStart

IdentifierName IdentifierPart

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.

PrivateIdentifier ::

# IdentifierName

1. Верните конкатенацию строк 0x0023 (ЗНАК ЧИСЛА - NUMBER SIGN) и StringValue для IdentifierName.

 

Семантика времени выполнения: Оценка

IdentifierReference : Identifier

1. Вернуть ? ResolveBinding(StringValue из Identifier).

IdentifierReference : yield

1. Вернуть ? ResolveBinding("yield").

IdentifierReference : await

1. Вернуть ? ResolveBinding("await").
Примечание 1

Результатом вычисления IdentifierReference всегда является значение типа Reference.

Примечание 2

В нестрогом коде ключевое слово yield может использоваться в качестве идентификатора. Оценка IdentifierReference разрешает привязку yield, как если бы это был идентификатор Identifier. Ограничение Early Error гарантирует, что такая оценка может выполняться только для нестрогого кода.

 

Информационные ссылки

Стандарт ECMAScript — Раздел «13.1 Identifiers» — https://tc39.es/ecma262/#sec-identifiers