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] ;
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
- Это синтаксическая ошибка, если инициализатор Initializer отсутствует и IsConstantDeclaration из LexicalDeclaration, содержащего это LexicalBinding, истинно (является true).
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