- 12 Инструкции
-
Синтаксис
- Инструкция :
- Блок
ИнструкцияПеременной
ПустаяИнструкция
ИнструкцияВыражение
ИнструкцияIf
ИнструкцияИтерации
ИнструкцияContinue
ИнструкцияBreak
ИнструкцияReturn
ИнструкцияWith
ИнструкцияСМеткой
ИнструкцияSwitch
ИнструкцияThrow
ИнструкцияTry
Семантика
Инструкция может быть частью ИнструкцииСМеткой, которая тоже может являться частью ИнструкцииСМеткой, и так далее. Определённые таким образом метки совместно называются в описаниях семантики отдельных инструкций "текущим набором меток". ИнструкцияСМеткой не имеет никакого семантического предназначения кроме добавления новой метки к набору меток. Набор меток ИнструкцииИтерации или ИнструкцииSwitch изначально содержит единственный элемент пусто. Набор меток любой другой инструкции изначально пуст.
- 12.1 Блок
-
Синтаксис
- Блок :
- { СписокИнструкцийопц }
- СписокИнструкций :
- Инструкция
СписокИнструкций Инструкция
Семантика
Значение нетерминала Блок : {} вычисляется по следующей схеме:
1. Вернуть (normal, empty, empty).
Значение нетерминала Блок : { СписокИнструкций } вычисляется по следующей схеме:
1. Вычислить значение СпискаИнструкций.
2. Вернуть Результат(1).
Значение нетерминала СписокИнструкций : Инструкция вычисляется по следующей схеме:
1. Вычислить значение Инструкции.
2. Если было брошено исключение, вернуть (throw, V, empty), где V - исключение. (Далее выполнение продолжается, как будто исключения брошено не было.)
3. Вернуть Результат(1).
Значение нетерминала СписокИнструкций : СписокИнструкций Инструкция вычисляется по следующей схеме:
1. Вычислить значение СпискаИнструкций.
2. Если Результат(1) является неожиданным завершением, вернуть Результат(1).
3. Вычислить значение Инструкции.
4. Если было брошено исключение, вернуть (throw, V, empty), где V - исключение. (Далее выполнение продолжается, как будто исключения брошено не было.)
5. Если Результат(3). значение равно empty, приравнять V = Результат(1). значение, иначе приравнять V = Результат(3). значение.
6. Вернуть (Результат(3). тип, V, Результат(3). цель).
- 12.2 Выражение переменной
-
Синтаксис
- ИнструкцияПеременной :
- var СписокОбъявленияПеременных ;
- СписокОбъявленияПеременных :
- ОбъявлениеПеременной
СписокОбъявленияПеременных , ОбъявлениеПеременной
- СписокОбъявленияПеременныхБезIn :
- ОбъявлениеПеременнойБезIn
СписокОбъявленияПеременныхБезIn , ОбъявлениеПеременнойБезIn
- ОбъявлениеПеременной :
- Идентификатор Инициализаторопц
- ОбъявлениеПеременнойБезIn :
- Идентификатор ИнициализаторБезInопц
- Инициализатор :
- = ВыражениеПрисваивания
- ИнициализаторБезIn :
- = ВыражениеПрисваиванияБезIn
Описание
Если инструкция переменной встречается внутри ОбъявленияФункции, переменные объявляются внутри локальной области видимости для данной функции согласно описанию в разделе 10.1.3. В противном случае они объявляются в глобальной области видимости (т.е. создаются как поля глобального объекта согласно описанию в разделе 10.1.3) с использованием атрибутов свойств { DontDelete }. Переменные создаются, когда происходит вход в область выполнения. Блок не определяет новой области выполнения. Только Программа и ОбъявлениеФункции создают новую область видимости. Переменные инициализируются при создании значением undefined. Переменной, для которой определён Инициализатор, присваивается значение его ВыраженияПрисваивания в момент выполнения ИнструкцииПеременной, а не в момент создания переменной.
Семантика
Значение нетерминала ИнструкцияПеременной : var СписокОбъявленияПеременных ; вычисляется по следующей схеме:
1. Вычислить значение СпискаОбъявленияПеременных.
2. Вернуть (normal, empty, empty).
Значение нетерминала СписокОбъявленияПеременных :ОбъявлениеПеременной вычисляется по следующей схеме:
1. Вычислить значение ОбъявленияПеременной.
Значение нетерминала СписокОбъявленияПеременных : СписокОбъявленияПеременных , ОбъявлениеПеременной вычисляется по следующей схеме:
1. Вычислить значение СпискаОбъявленияПеременных.
2. Вычислить значение ОбъявленияПеременной.
Значение нетерминала ОбъявлениеПеременной : Идентификатор вычисляется по следующей схеме:
1. Вернуть строковое значение, содержащее ту же последовательность символов, что и Идентификатор.
Значение нетерминала ОбъявлениеПеременной : Идентификатор Инициализатор вычисляется по следующей схеме:
1. Вычислить значение Идентификатора согласно описанию в разделе 11.1.2.
2. Вычислить значение Инициализатора.
3. Вызвать ПолучитьЗначение(Результат(2)).
4. Вызвать ЗаписатьЗначение(Результат(1), Результат(3)).
5. Вернуть строковое значение, содержащее ту же последовательность символов, что и Идентификатор.
Значение нетерминала Инициализатор : = ВыражениеПрисваивания вычисляется по следующей схеме:
1. Вычислить значение ВыраженияПрисваивания.
2. Вернуть Результат(1).
Значения нетерминалов СписокОбъявленияПеременныхБезIn, ОбъявлениеПеременнойБезIn и ИнициализаторБезIn вычисляются по той же схеме, что и СписокОбъявленияПеременных, ОбъявлениеПеременной и Инициализатор за исключением того, что значение вложенных СпискаОбъявленияПеременныхБезIn, ОбъявленияПеременнойБезIn, ИнициализатораБезIn и ВыраженияПрисваиванияБезIn вычисляются соответственно вместо вложенных СпискаОбъявленияПеременных, ОбъявленияПеременной, Инициализатора и ВыраженияПрисваивания.
- 12.3 Пустая инструкция
-
Синтаксис
- ПустаяИнструкция :
- ;
Семантика
Значение нетерминала ПустаяИнструкция : ; вычисляется по следующей схеме:
1. Вернуть (normal, empty, empty).
- 12.4 Инструкция-выражение
-
Синтаксис
- ИнструкцияВыражение :
- [предпросмотр ∉ {{, function}] Выражение ;
Заметим, что ИнструкцияВыражение не может начаться с открывающей фигурной скобки, т.к. тогда оно было бы неотличимо от Блока. Также ИнструкцияВыражение не может начинаться с ключевого слова function, т.к. тогда оно было бы неотличимо от ОбъявленияФункции.
Семантика
Значение нетерминала ИнструкцияВыражение : [предпросмотр ∉ {{, function}] Выражение; вычисляется по следующей схеме:
1. Вычислить значение Выражения.
2. Вызвать ПолучитьЗначение(Результата(1)).
3. Вернуть (normal, Результат(2), empty).
- 12.5 Инструкция if
-
Синтаксис
- ИнструкцияIf :
- if ( Выражение ) Инструкция else Инструкция
if ( Выражение ) Инструкция
Каждое ключевое слово else, для которого выбор соответствующего ему if неоднозначен, должно считаться относящимся к ближайшему if, для которого нет соответствующего ему else.
Семантика
Значение нетерминала ИнструкцияIf : if ( Выражение ) Инструкция else Инструкция вычисляется по следующей схеме:
1. Вычислить значение Выражения.
2. Вызвать ПолучитьЗначение(Результата(1)).
3. Вызвать ToBoolean(Результат(2)).
4. Если Результат(3) равен false - переход на шаг 7.
5. Вычислить значение первой Инструкции.
6. Вернуть Результат(5).
7. Вычислить значение второй Инструкции.
8.Вернуть Результат(7).
Значение нетерминала ИнструкцияIf : if ( Выражение ) Инструкция вычисляется по следующей схеме:
1. Вычислить значение Выражения.
2. Вызвать ПолучитьЗначение(Результата(1)).
3. Вызвать ToBoolean(Результат(2)).
4. Если Результат(3) равен false - вернуть (normal, empty, empty).
5. Вычислить значение Инструкции.
6. Вернуть Результат(5).
- 12.6 Инструкции итерации
-
Инструкция итерации состоит из заголовка (который содержит ключевое слово и заключённую в скобки управляющую конструкцию) и тела (которое состоит из Инструкций).
Синтаксис
- ИнструкцияИтерации :
- do Инструкция while ( Выражение );
while ( Выражение ) Инструкция
for ( ВыражениеБезInопц; Выражениеопц ; Выражениеопц ) Инструкция
for (var СписокОбъявленияПеременныхБезIn; Выражениеопц ; Выражениеопц ) Инструкция
for ( ЛевостороннееВыражение in Выражение ) Инструкция
for (var ОбъявлениеПеременнойБезIn in Выражение ) Инструкция
- 12.6.1 Инструкция do-while
-
Значение нетерминала do Инструкция while ( Выражение ); вычисляется по следующей схеме:
1. Пусть V = empty.
2. Вычислить значение Инструкции.
3. Если Результат(2). значение не равно empty, приравнять V = Результат(2). значение.
4. Если Результат(2). тип равен continue и Результат(2). цель принадлежит текущему набору меток - переход на шаг 7.
5. Если Результат(2). тип равен break и Результат(2). цель принадлежит текущему набору меток - вернуть (normal, V, empty).
6. Если Результат(2) является неожиданным завершением, вернуть Результат(2).
7. Вычислить значение Выражения.
8. Вызвать ПолучитьЗначение(Результат(7)).
9. Вызвать ToBoolean(Результат(8)).
10. Если Результат(9) равен true - переход на шаг 2.
11. Вернуть (normal, V, empty);
- 12.6.2 Инструкция while
-
Значение нетерминала ИнструкцияИтерации : while ( Выражение ) Инструкция вычисляется по следующей схеме:
1. Пусть V = empty.
2. Вычислить значение Выражения.
3. Вызвать ПолучитьЗначение(Результат(2)).
4. Вызвать ToBoolean(Результат(3)).
4. Если Результат(4) равен false - вернуть (normal, V, empty).
6. Вычислить значение Инструкции.
7. Если Результат(6). значение не равно empty, приравнять V = Результат(6). значение.
8. Если Результат(6). тип равен continue и Результат(6). цель принадлежит текущему набору меток - переход на шаг 2.
9. Если Результат(6). тип равен break и Результат(6). цель принадлежит текущему набору меток - вернуть (normal, V, empty).
10. 2. Если Результат(6) является неожиданным завершением, вернуть Результат(6).
11. Переход на шаг 2.
- 12.6.3 Инструкция for
-
Значение нетерминала ИнструкцияИтерации : for ( ВыражениеБезInопц ; Выражениеопц ; Выражениеопц) Инструкция вычисляется по следующей схеме:
1. Если ВыражениеБезIn опущено - переход на шаг 4.
2. Вычислить значение ВыраженияБезIn.
3. Вызвать ПолучитьЗначение(Результат(2)). (В дальнейшем это значение не используется.)
4. Пусть V = empty.
5. Если первое Выражение опущено - переход на шаг 10.
6. Вычислить значение первого Выражения.
7. Вызвать ПолучитьЗначение(Результат(6)).
8. Вызвать ToBoolean(Результат(7)).
9. Если Результат(8) равен false - переход на шаг 19.
10. Вычислить значение Инструкции.
11. Если Результат(10). значение не равно empty, приравнять V = Результат(10). значение.
12. Если Результат(10). тип равен break и Результат(10). цель принадлежит текущему набору меток - переход на шаг 19.
13. Если Результат(10). тип равен continue и Результат(10). цель принадлежит текущему набору меток - переход на шаг 15.
14. Если Результат(10) является неожиданным завершением, вернуть Результат(10).
15. Если второе Выражение опущено - переход на шаг 5.
16. Вычислить значение второго Выражения.
17. Вызвать ПолучитьЗначение(Результат(16)). (В дальнейшем это значение не используется.)
18. Переход на шаг 5.
19. Вернуть (normal, V, empty).
Значение нетерминала ИнструкцияИтерации : for (var СписокОбъявленияПеременныхБезIn ; Выражениеопц ; Выражениеопц ) Инструкция вычисляется по следующей схеме:
1. Вычислить значение СпискаОбъявленияПеременныхБезIn.
2. Пусть V = empty.
3. Если первое Выражение опущено - переход на шаг 8.
4. Вычислить значение первого Выражения.
5. Вызвать ПолучитьЗначение(Результат(4)).
6. Вызвать ToBoolean(Результат(5)).
7. Если Результат(6) равен false - переход на шаг 17.
8. Вычислить значение Инструкции.
9. Если Результат(8). значение не равно empty, приравнять V = Результат(8). значение.
10. Если Результат(8). тип равен break и Результат(8). цель принадлежит текущему набору меток - переход на шаг 17.
11. Если Результат(8). тип равен continue и Результат(8). цель принадлежит текущему набору меток - переход на шаг 13.
12. Если Результат(8) является неожиданным завершением, вернуть Результат(8).
13. Если второе Выражение опущено - переход на шаг 3.
14. Вычислить значение второго Выражения.
15. Вызвать ПолучитьЗначение(Результат(14)). (В дальнейшем это значение не используется.)
16. Переход на шаг 3.
17. Вернуть (normal, V, empty).
- 12.6.4 Инструкция for-in
-
Значение нетерминала ИнструкцияИтерации : for ( ЛевостороннееВыражение in Выражение ) Инструкция вычисляется по следующей схеме:
1. Вычислить значение первого Выражения.
2. Вызвать ПолучитьЗначение(Результат(1)).
3. Вызвать ToObject(Результат(2)).
4. Пусть V = empty.
5. Получить имя следующего по очереди свойства Результата(3), которое не имеет свойства DontEnum. Если такого свойства нет - переход на шаг 14.
6. Вычислить значение ЛевостороннегоВыражения (оно может вычисляться на каждой итерации).
7. Вызвать ЗаписатьЗначение(Результат(6), Результат(5)).
8. Вычислить значение Инструкции.
9. Если Результат(8). значение не равно empty, приравнять V = Результат(8). значение.
10. Если Результат(8). тип равен break и Результат(8). цель принадлежит текущему набору меток - переход на шаг 14.
11. Если Результат(8). тип равен continue и Результат(8). цель принадлежит текущему набору меток - переход на шаг 5.
12. Если Результат(8) является неожиданным завершением, вернуть Результат(8).
13. Переход на шаг 5.
14. Вернуть (normal, V, empty).
Значение нетерминала ИнструкцияИтерации : for (var ОбъявлениеПеременнойБезIn in Выражение ) Инструкция вычисляется по следующей схеме:
1. Вычислить значение ОбъявлениеПеременнойБезIn.
2. Вычислить значение Выражения.
3. Вызвать ПолучитьЗначение(Результат(2)).
4. Вызвать ToObject(Результат(3)).
5. Пусть V = empty.
6. Получить имя следующего по очереди свойства Результата(4), которое не имеет свойства DontEnum. Если такого свойства нет - переход на шаг 15.
7. Вычислить значение Результата(1) как будто это Идентификатор, см. раздел 0 (да, оно может вычисляться на каждой итерации).
8. Вызвать ЗаписатьЗначение(Результат(7), Результат(6)).
9. Вычислить значение Инструкции.
10. Если Результат(9). значение не равно empty, приравнять V = Результат(9). значение.
11. Если Результат(9). тип равен break и Результат(9). цель принадлежит текущему набору меток - переход на шаг 15.
12. Если Результат(9). тип равен continue и Результат(9). цель принадлежит текущему набору меток - переход на шаг 6.
13. Если Результат(8) является неожиданным завершением, вернуть Результат(8).
14. Переход на шаг 6.
15. Вернуть (normal, V, empty).
Механизм обхода (перечисления) свойств (шаг 5 первого алгоритма, шаг 6 второго) зависит от конкретной реализации. Порядок обхода определяется объектом. Свойства обходимого объекта могут быть удалены во время обхода. Если свойство, которое ещё не было посещено, удаляется, то оно не будет посещено в оставшейся части обхода. Если новые свойства были добавлены к объекту во время перечисления, их посещение в оставшейся части обхода не гарантируется.
Обход свойств объекта включает обход свойств его прототипа, прототипа прототипа и так далее рекурсивно. Однако свойство прототипа не обходится, если оно "перекрыто" свойством с тем же именем в каком-либо из объектов, предшествующих по иерархии прототипов.
- 12.7 Инструкция continue
-
Синтаксис
- ИнструкцияContinue :
- continue [здесь нет КонцаСтроки] Идентификаторопц ;
Семантика
Программа считается синтаксически некорректной, если выполнено одно из следующих условий:
- Программа содержит инструкцию continue без опционального Идентификатора, которая не является прямо или непрямо (но без пересечения границ функций) вложенной в ИнструкциюИтерации.
- Программа содержит инструкцию continue с опциональным Идентификатором, но такого Идентификатора нет в наборе меток ИнструкцииИтерации, окружающей (без пересечения границ функций) инструкцию continue.
Значение ИнструкцииContinue без Идентификатора вычисляется по следующей схеме:
1. Вернуть (continue, empty, empty).
Значение ИнструкцииContinue с опциональным Идентификатором вычисляется по следующей схеме:
1. Вернуть (continue, empty, Идентификатор).
- 12.8 Инструкция break
-
Синтаксис
- ИнструкцияBreak :
- break [здесь нет КонцаСтроки] Идентификаторопц ;
Семантика
Программа считается синтаксически некорректной, если выполнено одно из следующих условий:
- Программа содержит инструкцию break без опционального Идентификатора, которая не является прямо или непрямо (но без пересечения границ функций) вложенной в ИнструкциюИтерации или ИнструкциюSwitch.
- Программа содержит инструкцию continue с опциональным Идентификатором, но такого Идентификатора нет в наборе меток Инструкции, окружающей (без пересечения границ функций) инструкцию break.
Значение ИнструкцииBreak без Идентификатора вычисляется следующим образом:
1. Вернуть (break, empty, empty).
Значение ИнструкцииBreak с Идентификатором вычисляется следующим образом:
1. Вернуть (break, empty, Идентификатор).
- 12.9 Инструкция return
-
Синтаксис
- ИнструкцияReturn :
- return [здесь нет КонцаСтроки] Выражениеопц ;
Семантика
Программа считается синтаксически некорректной, если она содержит инструкцию return вне ТелаФункции. Инструкция return заставляет функцию прекратить своё выполнение и вернуть значение вызывающему. Если Выражение опущено, возвращается значение undefined. В прочих случаях возвращается значение Выражения.
Значение нетерминала ИнструкцияReturn : return [здесь нет КонцаСтроки] Выражениеопц ; вычисляется по следующей схеме:
1. Если Выражение опущено - вернуть (return, undefined, empty).
2. Вычислить значение Выражения.
3. Вызвать ПолучитьЗначение(Результат(2)).
4. Вернуть (return, Результат(3), empty).
- 12.10 Инструкция with
-
Синтаксис
- ИнструкцияWith :
- with ( Выражение ) Инструкция
Описание
Инструкция with добавляет вычисленный объект к началу иерархии областей видимостей текущего контекста исполнения, выполняет инструкцию с новой иерархией областей видимостей и затем восстанавливает иерархию в первоначальный вид.
Семантика
Значение нетерминала ИнструкцияWith : with ( Выражение ) Инструкция вычисляется по следующей схеме:
1. Вычислить значение Выражения.
2. Вызвать ПолучитьЗначение(Результат(1)).
3. Вызвать ToObject(Результат(2)).
4. Добавить Результат(3) к началу иерархии областей видимости.
5. Вычислить значение Инструкции, используя изменённую иерархию областей видимости с шага 4.
6. Пусть C = Результат(5). Если на шаге 5 было брошено исключение, приравнять C = (throw, V, empty), где V - брошенное исключение. (Далее выполнение продолжается, как будто исключения брошено не было.)
7. Убрать Результат(3) из начала иерархии областей видимости.
8. Вернуть C.
ЗАМЕЧАНИЕ
Каким бы образом управление не покинуло вложенную 'Инструкцию': нормальным путём, неожиданным завершением или бросив исключение - иерархия областей видимости всегда возвращается к первоначальному состоянию.
- 12.11 Инструкция switch
-
Синтаксис
- ИнструкцияSwitch :
- switch ( Выражение ) БлокCase
- БлокCase :
- { ВетвиCaseопц }
{ ВетвиCaseопц ВетвьПоУмолчанию ВетвиCaseопц }
- ВетвиCase :
- ВетвьCase
ВетвиCase ВетвьCase
- ВетвьCase :
- case Выражение : СписокИнструкцийопц
- ВетвьПоУмолчанию :
- default : СписокИнструкцийопц
Семантика
Значение нетерминала ИнструкцияSwitch : switch ( Выражение ) БлокCase вычисляется по следующей схеме:
1. Вычислить значение Выражения.
2. Вызвать ПолучитьЗначение(Результат(1)).
3. Вычислить значение БлокаCase, передав Результат(2) в качестве параметра.
4. Если Результат(3). тип равен break и Результат(2). цель принадлежит текущему набору меток - вернуть (normal, Результат(3).значение, empty).
5. Вернуть Результат(3).
Значение нетерминала БлокCase : {
ВетвиCaseопц }
с учётом входного параметра input вычисляется следующим образом:
1. Пусть V = empty.
2. Пусть A равно списку ВетвейCase в порядке исходного текста.
3. Пусть C равно следующей ВетвиCase в A. Если такой ВетвиCase не нашлось - переход на шаг 16.
4. Вычислить значение C.
5. Если input не равен Результату(4) (согласно определению оператора !==
) - переход на шаг 3.
6. Если у C нет СпискаИнструкций - переход на шаг 10.
7. Вычислить значение СпискаИнструкций C и приравнять R результат.
8. Если R - неожиданное завершение, вернуть R.
9. Пусть V = R.значение.
10. Пусть C - следующая ВетвиCase из A. Если такой ВетвиCase не нашлось - переход на шаг 16.
11. Если у C нет СпискаИнструкций - переход на шаг 10.
12. Вычислить значение СпискаИнструкций C, получив результат R.
13. Если R.значение не равно empty, приравнять V = R.значение.
14. Если R - неожиданное завершение, вернуть (R.тип, V, R.цель).
15. Переход на шаг 10.
16. Вернуть (normal, V, empty).
Значение нетерминала БлокCase : {
ВетвиCaseопц ВетвьПоУмолчанию ВетвиCaseопц }
с учётом входного параметра input вычисляется следующим образом:
1. Пусть V = empty.
2. Пусть A - список ВетвейCase в первом элементе ВетвиCase в порядке исходного текста.
3. Пусть C - следующая ВетвьCase в A. Если такой ВетвиCase не нашлось - переход на шаг 11.
4. Вычислить значение C.
5. Если input не равен Результату(4) (согласно определению оператора !==
) - переход на шаг 3.
6. Если у C нет СпискаИнструкций - переход на шаг 20.
7. Вычислить значение СпискаИнструкций C, получив результат R.
8. Если R - неожиданное завершение, вернуть R.
9. Пусть V = R.значение.
10. Переход на шаг 20.
11. Пусть B - список ВетвейCase во втором элементе ВетвиCase в порядке исходного текста.
12. Пусть C - следующая ВетвьCase в B. Если такой ВетвиCase не нашлось - переход на шаг 26.
13. Вычислить значение C.
14. Если input не равен Результату(13) (согласно определению оператора !==
) - переход на шаг 12.
15. Если у C нет СпискаИнструкций - переход на шаг 31.
16. Вычислить значение СпискаИнструкций C, получив результат R.
17. Если R - неожиданное завершение, вернуть R.
18. Пусть V = R.значение.
19. Переход на шаг 31.
20. Пусть C - следующая ВетвьCase в A. Если такой ВетвиCase не нашлось - переход на шаг 26.
21. Если у C нет СпискаИнструкций - переход на шаг 20.
22. Вычислить значение СпискаИнструкций C, получив результат R.
23. Если R.значение не равно пусто, приравнять V = R.значение.
24. Если R - неожиданное завершение, вернуть (R.тип, V, R.цель).
25. Переход на шаг 20.
26. Если у ВетвиПоУмолчанию нет СпискаИнструкций - переход на шаг 30.
27. Вычислить значение СпискаИнструкций ВетвиПоУмолчанию, получив результат R.
28. Если R.значение не равно пусто, приравнять V = R.значение.
29. Если R - неожиданное завершение, вернуть (R.тип, V, R.цель).
30. Пусть B равно списку ВетвейCase во втором элементе ВетвиCase в порядке исходного текста.
31. Пусть C - следующая ВетвьCase в B. Если такой ВетвиCase не нашлось - переход на шаг 37.
32. Если у C нет СпискаИнструкций - переход на шаг 31.
33. Вычислить значение СпискаИнструкций C, получив результат R.
34. Если R.значение не равно пусто, приравнять V = R.значение.
35. Если R - неожиданное завершение, вернуть (R.тип, V, R.цель).
36. Переход на шаг 31.
37. Вернуть (normal, V, empty).
Значение нетерминала ВетвьCase : case Выражение : СписокИнструкцийопц вычисляется по следующей схеме:
1. Вычислить значение Выражения.
2. Вызвать ПолучитьЗначение(Результат(1)).
3. Вернуть Результат(2).
ЗАМЕЧАНИЕ
При получении значения ВетвиCase соответствующий ей СписокИнструкций не выполняется. Просто вычисляется и возвращается значение Выражения, которое используется БлокомCase для выбора СпискаИнструкций, который следует начать исполнять.
- 12.12 Инструкции с метками
-
Синтаксис
- ИнструкцияСМеткой :
- Идентификатор : Инструкция
Семантика
Перед Инструкцией может быть указана метка. Инструкции с метками используются только совместно с инструкциями break и continue, для которых были указаны метки перехода. В ECMAScript нет оператора goto.
Программа на ECMAScript считается синтаксически некорректной, если она содержит ИнструкциюСМеткой, которая находится внутри ИнструкцииСМеткой с таким же Идентификатором в качестве метки. Исключение составляют метки, содержащиеся внутри ОбъявленийФункций, находящихся внутри инструкций с метками.
Значение нетерминала Идентификатор : Инструкция вычисляется путём добавления Идентификатора к набору меток Инструкции и затем вычисления Инструкции. Если у ИнструкцииСМеткой уже есть непустой набор меток, эти метки тоже добавляются к набору меток Инструкции перед вычислением её значения. Если результат вычисления значения Инструкции равен (break, V, L), где L равно Идентификатору, результатом вычисления нетерминала становится (normal, V, empty).
Перед вычислением значения ИнструкцииСМеткой, содержащаяся в ней Инструкция считается содержащей пустое множество меток, кроме тех случаев, когда это ИнструкцияИтерации или ИнструкцияSwitch. Тогда она считается имеющей множество меток, состоящее из одного элемента пусто.
- 12.13 Инструкция throw
-
Синтаксис
- ИнструкцияThrow :
- throw [здесь нет КонцаСтроки] Выражение ;
Семантика
Значение нетерминала ИнструкцияThrow : throw [здесь нет КонцаСтроки] Выражение ; вычисляется по следующей схеме:
1. Вычислить значение Выражения.
2. Вызвать ПолучитьЗначение(Результат(1)).
3. Вернуть (throw, Результат(2), empty).
- 12.14 Инструкций try
-
Синтаксис
- ИнструкцияTry :
- try Блок Catch
try Блок Finally
try Блок Catch Finally
- Catch :
- catch (Идентификатор ) Блок
- Finally :
- finally Блок
Описание
Инструкция try используется для заключения в себе блока кода, в котором может наступить исключительное состояние, такое как ошибка выполнения или инструкция throw. Раздел catch содержит код обработки исключения. Когда раздел catch ловит исключение, его Идентификатор привязывается к этому исключению.
Семантика
Значение нетерминала ИнструкцияTry : try Блок Catch вычисляется по следующей схеме:
1. Вычислить значение Блока.
2. Если Результат(1). тип не равен throw - вернуть Результат(1).
3. Вычислить значение Catch с параметром Результат(1).
4. Вернуть Результат(3).
Значение нетерминала ИнструкцияTry : try Блок Finally вычисляется по следующей схеме:
1. Вычислить значение Блока.
2. Вычислить значение Finally.
3. Если Результат(2).тип равен normal, вернуть Результат(1).
4. Вернуть Результат(2).
Значение нетерминала ИнструкцияTry : try Блок Catch Finally вычисляется по следующей схеме:
1. Вычислить значение Блока.
2. Пусть C = Результат(1).
3. Если Результат(1). тип не равен throw - переход на шаг 6.
4. Вычислить значение Catch с параметром Результат(1).
5. Пусть C = Результат(4).
6. Вычислить значение Finally.
7. Если Результат(6). тип равно normal - вернуть C.
8. Вернуть Результат(6).
Значение нетерминала Catch : catch (Идентификатор ) Блок вычисляется по следующей схеме:
1. Пусть C равно параметру, переданному этому нетерминалу.
2. Создать новый объект, как он был бы создан выражением new Object().
3. Создать свойство в объекте Результат(2). Имя свойства Идентификатор, значение равно C. значение, атрибуты равны { DontDelete }.
4. Добавить Результат(2) к началу иерархии областей видимости.
5. Вычислить значение Блока.
6. Убрать Результат(2) из начала иерархии областей видимости.
7. Вернуть Результат(5).
Значение нетерминала Finally : finally Блок вычисляется по следующей схеме:
1. Вычислить значение Блока.
2. Вернуть Результат(1).