ECMAScript | Объявления и Оператор Переменной

ECMAScript | Объявления и Оператор Переменной

14.3.1 Объявления Let и Const

Примечание

Объявления let и const определяют переменные, которые привязаны к «лексической среде» (LexicalEnvironment) текущего контекста выполнения. Переменные создаются при создании экземпляра содержащейся в них «записи среды«(Environment Record), но к ним нельзя получить доступ каким-либо образом до тех пор, пока не будет вычислена «лексическая привязка» (LexicalBinding) переменной. Переменной, определенной лексической привязкой LexicalBinding с инициализатором Initializer, присваивается значение «выражения присвоения» AssignmentExpression ее инициализатора Initializer при оценке LexicalBinding, а не при создании переменной. Если LexicalBinding в объявлении let не имеет инициализатора Initializer, переменной при оценке LexicalBinding присваивается значение undefined.

 

Синтаксис

LexicalDeclaration [In, Yield, Await] :

LetOrConst BindingList [?In, ?Yield, ?Await] ;

LetOrConst :

let

const

BindingList [In, Yield, Await] :

LexicalBinding [?In, ?Yield, ?Await]

BindingList [?In, ?Yield, ?Await] , LexicalBinding [?In, ?Yield, ?Await]

LexicalBinding [In, Yield, Await] :

BindingIdentifier [?Yield, ?Await] Initializer [?In, ?Yield, ?Await] opt

BindingPattern [?Yield, ?Await] Initializer [?In, ?Yield, ?Await]

 

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

LexicalDeclaration : LetOrConst BindingList ;

  • Это синтаксическая ошибка, если «Связанные Имена» BoundNames в BindingList содержит «let».
  • Это синтаксическая ошибка, если «Связанные Имена» BoundNames в BindingList содержит какие-либо повторяющиеся записи.

LexicalBinding : BindingIdentifier Initializer opt

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

LexicalDeclaration : LetOrConst BindingList ;

1. Пусть next будет результатом вычисления списка привязки BindingList.
2. ReturnIfAbrupt(next).
3. Верните NormalCompletion(empty).

BindingList : BindingList , LexicalBinding

1. Пусть next будет результатом вычисления списка привязки BindingList.
2. ReturnIfAbrupt(next).
3. Верните результат вычисления LexicalBinding.

LexicalBinding : BindingIdentifier

1. Пусть lhs будет ResolveBinding(StringValue из BindingIdentifier).
2. Верните InitializeReferencedBinding(lhs, undefined).
Примечание

Правило статической семантики гарантирует, что эта форма лексической привязки LexicalBinding никогда не встречается в объявлении const.

LexicalBinding : BindingIdentifier Initializer

1. Пусть bindingId будет StringValue для BindingIdentifier.
2. Пусть lhs будет ResolveBinding(bindingId).
3. Если IsAnonymousFunctionDefinition(Initializer) истинно (является true), то
   а. Пусть значение value будет NamedEvaluation инициализатора Initializer с аргументом bindingId.
4. Иначе,
   а. Пусть rhs будет результатом вычисления инициализатора Initializer.
   b. Пусть value будет ? GetValue(rhs).
5. Верните InitializeReferencedBinding(lhs, value).

LexicalBinding : BindingPattern Initializer

1. Пусть rhs будет результатом вычисления инициализатора Initializer.
2. Пусть value будет ? GetValue(rhs).
3. Пусть env будет лексической средой (LexicalEnvironment) текущего контекста выполнения.
4. Верните результат выполнения BindingInitialization для BindingPattern, используя value и env в качестве аргументов.

 

 

14.3.2 Заявление о переменной

Примечание

Оператор var объявляет переменные, которые привязаны к «лексической среде» (LexicalEnvironment) текущего контекста выполнения. Переменные Var создаются при создании экземпляра содержащейся в них «записи среды«(Environment Record) и инициализируются значением undefined при создании. В рамках любой «переменной среды» (VariableEnvironment) общий «идентификатор привязки» (BindingIdentifier) может появляться более чем в одном «объявлении переменной» (VariableDeclaration), но эти объявления вместе определяют только одну переменную. Переменной, определенной с помощью VariableDeclaration с инициализатором Initializer, присваивается значение «Выражение присвоения» (AssignmentExpression) его инициализатора Initializer при выполнении VariableDeclaration, а не при создании переменной.

Синтаксис

VariableStatement [Yield, Await] :

var VariableDeclarationList [+In, ?Yield, ?Await] ;

VariableDeclarationList [In, Yield, Await] :

VariableDeclaration [?In, ?Yield, ?Await]

VariableDeclarationList [?In, ?Yield, ?Await] , VariableDeclaration [?In, ?Yield, ?Await]

VariableDeclaration [In, Yield, Await] :

BindingIdentifier [?Yield, ?Await] Initializer [?In, ?Yield, ?Await] opt

BindingPattern [?Yield, ?Await] Initializer [?In, ?Yield, ?Await]

 

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

VariableStatement : var VariableDeclarationList ;

1. Пусть next будет результатом вычисления VariableDeclarationList.
2. ReturnIfAbrupt(next).
3. Верните NormalCompletion(empty).

VariableDeclarationList : VariableDeclarationList , VariableDeclaration

1. Пусть next будет результатом вычисления VariableDeclarationList.
2. ReturnIfAbrupt(next).
3. Верните результат вычисления VariableDeclaration.

VariableDeclaration : BindingIdentifier

1. Верните NormalCompletion(empty).

VariableDeclaration : BindingIdentifier Initializer

1. Пусть bindingId будет StringValue для BindingIdentifier.
2. Пусть lhs будет ? ResolveBinding(bindingId).
3. Если IsAnonymousFunctionDefinition(Initializer) истинно (является true), то
   а. Пусть значением будет NamedEvaluation инициализатора Initializer с аргументом bindingId.
4. Иначе,
   а. Пусть rhs будет результатом вычисления Initializer.
   b. Пусть value будет ? GetValue(rhs).
5. Вернуть ? PutValue(lhs, value).
Примечание

Если объявление переменной VariableDeclaration вложено в оператор with, а идентификатор привязки BindingIdentifier в VariableDeclaration совпадает с именем свойства привязки объекта Environment Record в операторе with, тогда на шаге 5 будет присвоено значение value свойству, а не привязке VariableEnvironment идентификатора Identifier.

VariableDeclaration : BindingPattern Initializer

1. Пусть rhs будет результатом вычисления Initializer.
2. Пусть rval будет ? GetValue(rhs).
3. Вернуть результат выполнения BindingInitialization для BindingPattern, передав rval и undefined в качестве аргументов.

 

14.3.3 Разрушение шаблонов привязки

Синтаксис

BindingPattern [Yield, Await] :

ObjectBindingPattern [?Yield, ?Await]

ArrayBindingPattern [?Yield, ?Await]

ObjectBindingPattern [Yield, Await] :

{ }

{ BindingRestProperty [?Yield, ?Await] }

{ BindingPropertyList [?Yield, ?Await] }

{ BindingPropertyList [?Yield, ?Await] , BindingRestProperty [?Yield, ?Await] opt }

ArrayBindingPattern [Yield, Await] :

[ Elision opt BindingRestElement [?Yield, ?Await] opt ]

[ BindingElementList [?Yield, ?Await] ]

[ BindingElementList [?Yield, ?Await] , Elision opt BindingRestElement [?Yield, ?Await] opt ]

BindingRestProperty [Yield, Await] :

BindingIdentifier [?Yield, ?Await]

BindingPropertyList [Yield, Await] :

BindingProperty [?Yield, ?Await]

BindingPropertyList [?Yield, ?Await] , BindingProperty [?Yield, ?Await]

BindingElementList [Yield, Await] :

BindingElisionElement [?Yield, ?Await]

BindingElementList [?Yield, ?Await] , BindingElisionElement [?Yield, ?Await]

BindingElisionElement [Yield, Await] :

Elision opt BindingElement [?Yield, ?Await]

BindingProperty [Yield, Await] :

SingleNameBinding [?Yield, ?Await]

PropertyName [?Yield, ?Await] : BindingElement [?Yield, ?Await]

BindingElement [Yield, Await] :

SingleNameBinding [?Yield, ?Await]

BindingPattern [?Yield, ?Await] Initializer [+In, ?Yield, ?Await] opt

SingleNameBinding [Yield, Await] :

BindingIdentifier [?Yield, ?Await] Initializer [+In, ?Yield, ?Await] opt

BindingRestElement [Yield, Await] :

BindingIdentifier [?Yield, ?Await]

BindingPattern [?Yield, ?Await]

 

14.3.3.1 Семантика времени выполнения: PropertyBindingInitialization — Инициализация Привязки Свойства

С параметрами value and environment.

Примечание

Они собирают список всех связанных имен свойств, а не просто пустое завершение.

BindingPropertyList : BindingPropertyList , BindingProperty

1. Пусть boundNames будет ? PropertyBindingInitialization из BindingPropertyList с аргументами value и environment.
2. Пусть nextNames будет ? PropertyBindingInitialization из BindingProperty с аргументами value и environment.
3. Верните конкатенацию списка boundNames и nextNames.

BindingProperty : SingleNameBinding

1. Пусть name будет строкой, которая является единственным элементом BoundNames из SingleNameBinding.
2. Выполнить ? KeyedBindingInitialization для SingleNameBinding с использованием value, environment и name (значения, среды и имени) в качестве аргументов.
3. Вернуть Список, единственным элементом которого является name.

BindingProperty : PropertyName : BindingElement

1. Пусть P будет результатом вычисления PropertyName.
2. ReturnIfAbrupt(P).
3. Выполнить ? KeyedBindingInitialization из BindingElement с value, environment и P в качестве аргументов.
4. Верните Список, единственным элементом которого является P.

 

14.3.3.2 Семантика времени выполнения: RestBindingInitialization — Инициализация Привязки Остатка

С параметрами value, environment и excludedNames.

BindingRestProperty :  BindingIdentifier

1. Пусть lhs будет ? ResolveBinding(StringValue из BindingIdentifier, environment).
2. Пусть restObj будет ! OrdinaryObjectCreate(%Object.prototype%).
3. Выполнить ? CopyDataProperties(restObj, value, excludedNames).
4. Если environment undefined, верните PutValue(lhs, restObj).
5. Верните InitializeReferencedBinding(lhs, restObj).

 

 

14.3.3.3 Семантика времени выполнения: KeyedBindingInitialization — Инициализация Привязки с Ключом

С параметрами value, environment и propertyName.

Примечание

Если для среды environment передается undefined, это означает, что для присвоения значения инициализации следует использовать операцию PutValue. Так обстоит дело со списками формальных параметров нестрогих функций. В этом случае привязки формальных параметров предварительно инициализируются, чтобы иметь дело с возможностью нескольких параметров с одним и тем же именем.

BindingElement : BindingPattern Initializer opt

1. Пусть v будет ? GetV(value, propertyName).
2. Если инициализатор Initializer присутствует и v является undefined (не определено), то
   а. Пусть defaultValue будет результатом оценки Initializer.
   b. Установите v на ? GetValue(defaultValue).
3. Верните результат выполнения BindingInitialization для BindingPattern, передав v и среду environment в качестве аргументов.

SingleNameBinding : BindingIdentifier Initializer opt

1. Пусть bindingId будет строковым значением StringValue для идентификатора привязки BindingIdentifier.
2. Пусть lhs будет ? ResolveBinding(bindingId, environment).
3. Пусть v будет? GetV(value, propertyName).
4. Если инициализатор Initializer присутствует и v является undefined (не определено), то
   а. Если IsAnonymousFunctionDefinition(Initializer) истинно (является true), то
      i. Установите v равным результату выполнения NamedEvaluation для инициализатора Initializer с аргументом bindingId.
   b. Иначе,
      i. Пусть defaultValue будет результатом оценки Initializer.
      ii. Установите v на ? GetValue(defaultValue).
5. Если среда environment является undefined (не определена), вернуть ? PutValue(lhs, v).
6. Верните InitializeReferencedBinding(lhs, v).

 

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

Стандарт ECMAScript — Раздел «14 ECMAScript Language: Statements and Declarations» — https://tc39.es/ecma262/#sec-ecmascript-language-statements-and-declarations