ECMAScript | Блок

ECMAScript | Блок

Синтаксис Блока

BlockStatement [Yield, Await, Return] :

Block [?Yield, ?Await, ?Return]

Block [Yield, Await, Return] :

{ StatementList [?Yield, ?Await, ?Return] opt }

StatementList [Yield, Await, Return] :

StatementListItem [?Yield, ?Await, ?Return]

StatementList [?Yield, ?Await, ?Return] StatementListItem [?Yield, ?Await, ?Return]

StatementListItem [Yield, Await, Return] :

Statement [?Yield, ?Await, ?Return]

Declaration [?Yield, ?Await]

 

14.2.1 Статическая семантика: Ранние Ошибки

Block : { StatementList }

 

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

Block : { }

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

Block : { StatementList }

1. Пусть oldEnv будет лексической средой LexicalEnvironment текущего контекста выполнения.
2. Пусть blockEnv будет NewDeclarativeEnvironment(oldEnv).
3. Выполните создание экземпляра объявления блока BlockDeclarationInstantiation(StatementList, blockEnv).
4. Установите для LexicalEnvironment текущего контекста выполнения значение blockEnv.
5. Пусть blockValue будет результатом вычисления StatementList.
6. Установите LexicalEnvironment текущего контекста выполнения на oldEnv.
7. Вернуть значение blockValue.
Примечание 1

Независимо от того, как контроль покидает блок Block, LexicalEnvironment всегда возвращается в свое прежнее состояние.

StatementList : StatementList StatementListItem

1. Пусть sl будет результатом вычисления StatementList.
2. ReturnIfAbrupt(sl).
3. Пусть s будет результатом вычисления StatementListItem.
4. Вернуть завершение Completion(UpdateEmpty(s, sl)).
Примечание 2

Значение StatementList — это значение последнего порождающего значение элемента в StatementList. Например, все следующие вызовы функции eval возвращают значение 1:

eval("1;;;;;")
eval("1;{}")
eval("1;var a;")

 

14.2.3 BlockDeclarationInstantiation ( code, env )

Абстрактная операция BlockDeclarationInstantiation принимает аргументы code (узел синтаксического анализа) и env (декларативную запись среды).

code — это узел синтаксического анализа, соответствующий телу блока.

env — это запись среды, в которой должны быть созданы привязки.

Примечание

Когда блок Block или блок корпуса CaseBlock оцениваются, создается новая декларативная запись среды, и привязки для каждой переменной, константы, функции или класса, объявленные в блоке, создаются в записи среды.

При вызове она выполняет следующие шаги:

1. Пусть объявления declarations будут LexicallyScopedDeclarations для кода code.
2. Пусть privateEnv будет частной средой PrivateEnvironment текущего контекста выполнения.
3. Для каждого элемента d из объявлений declarations выполните
   а. Для каждого элемента dn из BoundNames из d выполните
      i. Если IsConstantDeclaration из d истинно (является true), то
         1. Выполнить ! env.CreateImmutableBinding(dn, true).
      ii. Иначе,
         1. Выполнить ! env.CreateMutableBinding(dn, false). ПРИМЕЧАНИЕ. Этот шаг заменен в разделе B.3.2.6.
   b. Если d - это FunctionDeclaration, GeneratorDeclaration, AsyncFunctionDeclaration или AsyncGeneratorDeclaration, тогда
      i. Пусть fn будет единственным элементом BoundNames из d.
      ii. Пусть fo будет InstantiateFunctionObject из d с аргументами env и privateEnv.
      iii. Выполните env.InitializeBinding(fn, fo). ПРИМЕЧАНИЕ. Этот шаг заменен в разделе B.3.2.6.

 

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

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