Синтаксис
Statement :
Block
VariableStatement
EmptyStatement
ExpressionStatement
IfStatement
IterationStatement
ContinueStatement
BreakStatement
ReturnStatement
WithStatement
LabelledStatement
SwitchStatement
ThrowStatement
TryStatement
DebuggerStatement
Семантика
Statement Инструкция может являться частью LabelledStatement Инструкция с меткой, которая, в свою очередь, может быть частью другой LabelledStatement, и так далее. При описании семантики отдельных инструкций подобные метки собирательно называются "текущим набором меток". LabelledStatement не имеет иного семантического значения, кроме внесения метки в набор меток. Набор меток для IterationStatement Инструкция итерации или SwitchStatement Инструкция switch изначально содержит единственный элемент empty пусто. Набор меток для любой другой инструкции изначально пуст.
ПРИМЕЧАНИЕ Известно, что несколько широко распространённых реализаций языка ECMAScript поддерживают использование FunctionDeclaration Объявление функции в качестве инструкции. Однако в семантике, применимой к таким объявлениям функций, имеются существенные противоречивые вариации реализаций. Из-за этих противоречий код, написанный с использованием FunctionDeclaration в качестве Statement, не является надёжным при переносе из одной реализации в другую. Поэтому для реализаций ECMAScript рекомендуется либо отключать использование FunctionDeclaration, либо генерировать предупреждение в случае такого использования. Возможно, в последующих версиях языка ECMAScript появятся альтернативные средства для переноса кода, позволяющие объявлять функции в контексте Statement.
Синтаксис
Block :
{
StatementListopt}
StatementList :
Statement
StatementList Statement
Семантика
Для вычисления Block : {
}
выполняются следующие шаги:
Вернуть (normal, empty, empty).
Для вычисления Block : {
StatementList }
выполняются следующие шаги:
Вернуть результат вычисления StatementList Список инструкций.
Для вычисления StatementList : Statement выполняются следующие шаги:
Пусть s будет результатом вычисления Statement.
Если было сгенерировано исключение, вернуть (throw, V, empty), где V – исключение. (После этого продолжается выполнение кода, как если бы исключение не было сгенерировано).
Вернуть s.
Для вычисления StatementList : StatementList Statement выполняются следующие шаги:
Пусть sl будет результатом вычисления StatementList.
Если sl – непредвиденное завершение, вернуть sl.
Пусть s будет результатом вычисления Statement.
Если было сгенерировано исключение, вернуть (throw, V, empty), где V – исключение. (После этого продолжается выполнение кода, как если бы исключение не было сгенерировано).
Если s.value – пусто, пусть V = sl.value, в противном случае пусть V = s.value.
Вернуть (s.type, V, s.target).
Синтаксис
VariableStatement :
var
VariableDeclarationList ;
VariableDeclarationList :
VariableDeclaration
VariableDeclarationList ,
VariableDeclaration
VariableDeclarationListNoIn :
VariableDeclarationNoIn
VariableDeclarationListNoIn ,
VariableDeclarationNoIn
VariableDeclaration :
Identifier Initialiseropt
VariableDeclarationNoIn :
Identifier InitialiserNoInopt
Initialiser :
=
AssignmentExpression
InitialiserNoIn :
=
AssignmentExpressionNoIn
Инструкция переменной объявляет переменные, создаваемые в соответствии с определением в пункте 10.5. При создании переменные инициализируются со значением undefined. Переменной с инициализатором Initialiser присваивается значение его выражения присваивания AssignmentExpression не в момент создания переменной, а в момент исполнения инструкции переменой VariableStatement.
Семантика
Для вычисления VariableStatement : var
VariableDeclarationList ;
выполняются следующие шаги:
Вычислить VariableDeclarationList Список объявления переменных.
Вернуть (normal, empty, empty).
Для вычисления VariableDeclarationList : VariableDeclaration выполняются следующие шаги:
Вычислить VariableDeclaration Объявление переменной.
Для вычисления VariableDeclarationList : VariableDeclarationList ,
VariableDeclaration выполняются следующие шаги:
Вычислить VariableDeclarationList.
Вычислить VariableDeclaration.
Для вычисления VariableDeclaration : Identifier выполняются следующие шаги:
Вернуть строковое значение, содержащее такую же последовательность символов, что и в Identifier.
Для вычисления VariableDeclaration : Identifier Initialiser выполняются следующие шаги:
Пусть lhs будет результатом вычисления Identifier в соответствии с описанием в пункте 11.1.2.
Пусть rhs будет результатом вычисления Initialiser Инициализатор.
Пусть value будет GetValue(rhs).
Вызвать PutValue(lhs, value).
Вернуть строковое значение, содержащее такую же последовательность символов, что и в Identifier.
ПРИМЕЧАНИЕ Строковое значение VariableDeclaration используется при вычислении инструкций for-in (12.6.4).
Если VariableDeclaration вложено в инструкцию with, а идентификатор в VariableDeclaration такой же, что и имя свойства объекта привязки для записи окружения объекта инструкции with, то в шаге 4 будет присваиваться значение свойству, а не привязке VariableEnvironment для Identifier.
Для вычисления Initialiser : =
AssignmentExpression выполняются следующие шаги:
Вернуть результат вычисления AssignmentExpression.
Для вычисления VariableDeclarationListNoIn Список объявления переменных без in, VariableDeclarationNoIn Объявление переменной без in и InitialiserNoIn Инициализатор без in выполняются точно такие же шаги, что и для вычисления VariableDeclarationList, VariableDeclaration и Initialiser, за исключением того, что вместо вложенных VariableDeclarationList, VariableDeclaration, Initialiser и AssignmentExpression вычисляются вложенные VariableDeclarationListNoIn, VariableDeclarationNoIn, InitialiserNoIn и AssignmentExpressionNoIn соответственно.
Если VariableDeclaration или VariableDeclarationNoIn встречается в строгом коде, и при этом его идентификатор Identifier представляет собой либо "eval"
, либо "arguments"
, генерируется SyntaxError.
Синтаксис
EmptyStatement :
;
Семантика
Для вычисления EmptyStatement : ;
выполняются следующие шаги:
Вернуть (normal, empty, empty).
Синтаксис
ExpressionStatement :
[lookahead ∉ {{
,function
}] Expression ;
ПРИМЕЧАНИЕ ExpressionStatement Инструкция-выражение не может начинаться с открывающей фигурной скобки, поскольку из-за этого её можно перепутать с блоком Block. Кроме того, она не может начинаться с ключевого слова function
, так как из-за этого её можно перепутать с объявлением функции FunctionDeclaration.
Семантика
Для вычисления ExpressionStatement : [lookahead ∉ {{
,function
}]Expression;
выполняются следующие шаги:
Пусть exprRef будет результатом вычисления Expression.
Вернуть (normal, GetValue(exprRef), empty).
Синтаксис
IfStatement :
if
(
Expression )
Statement else
Statementif
(
Expression )
Statement
Каждое else
, для которого выбор соответствующего ему if
является неоднозначным, будет ассоциироваться с ближайшим к нему if, у которого в противном случае нет соответствующего ему else
.
Семантика
Для вычисления IfStatement : if
(
Expression )
Statement else
Statement выполняются следующие шаги:
Пусть exprRef будет результатом вычисления Expression.
Если ToBoolean(GetValue(exprRef)) равно true, то
Вернуть результат вычисления первого Statement.
Иначе
Вернуть результат вычисления второго Statement.
Для вычисления IfStatement : if
(
Expression )
Statement выполняются следующие шаги:
Пусть exprRef будет результатом вычисления Expression.
Если ToBoolean(GetValue(exprRef)) равно false, вернуть (normal, empty, empty).
Вернуть результат вычисления Statement.
Синтаксис
IterationStatement :
do
Statement while
(
Expression );
while
(
Expression )
Statementfor
(
ExpressionNoInopt;
Expressionopt;
Expressionopt)
Statementfor
(
var
VariableDeclarationListNoIn;
Expressionopt;
Expressionopt)
Statementfor
(
LeftHandSideExpression in
Expression )
Statementfor
(
var
VariableDeclarationNoIn in
Expression )
Statement
Для вычисления do
Statement while
(
Expression );
выполняются следующие шаги:
Пусть V = empty пусто.
Пусть iterating итерация будет true.
Повторять, пока iterating равно true.
Пусть stmt будет результатом вычисления Statement.
Если stmt.value не равно empty, пусть V = stmt.value.
Если stmt.type не равно continue || stmt.target не принадлежит к текущему набору меток, то
Если stmt.type не равно break, и stmt.target принадлежит к текущему набору меток, вернуть (normal, V, empty).
Если stmt – непредвиденное завершение, вернуть stmt.
Пусть exprRef будет результатом вычисления Expression.
Если ToBoolean(GetValue(exprRef)) равно false, присвоить iterating значение false.
Вернуть (normal, V, empty);
Для вычисления IterationStatement : while
(
Expression )
Statement выполняются следующие шаги:
Пусть V = empty.
Повторить
Пусть exprRef будет результатом вычисления Expression.
Если ToBoolean(GetValue(exprRef)) равно false, вернуть (normal, V, empty).
Пусть stmt будет результатом вычисления Statement.
Если stmt.value не равно empty, пусть V = stmt.value.
Если stmt.type не равно continue || stmt.target не принадлежит к текущему набору меток, то
Если stmt.type равно break, и stmt.target принадлежит к текущему набору меток, то
Вернуть (normal, V, empty).
Если stmt – непредвиденное завершение, вернуть stmt.
Для вычисления
IterationStatement : for
(
ExpressionNoInopt;
Expressionopt;
Expressionopt)
Statement
выполняются следующие шаги:
Если присутствует ExpressionNoIn, то
Пусть exprRef будет результатом вычисления ExpressionNoIn.
Вызвать GetValue(exprRef). (Это значение не используется).
Пусть V = empty.
Повторить
Если присутствует первое Expression, то
Пусть stmt будет результатом вычисления Statement.
Если stmt.value не равно empty, пусть V = stmt.value.
Если stmt.type не равно break, и stmt.target принадлежит к текущему набору меток, вернуть (normal, V, empty).
Если stmt.type не равно continue || stmt.target не принадлежит к текущему набору меток, то
Если stmt – непредвиденное завершение, вернуть stmt.
Если присутствует второе Expression, то
Пусть incExprRef будет результатом вычисления второго Expression.
Вызвать GetValue(incExprRef). (Это значение не используется.)
Для вычисления
IterationStatement : for
(
var
VariableDeclarationListNoIn ;
Expressionopt;
Expressionopt)
Statement
выполняются следующие шаги:
Вычислить VariableDeclarationListNoIn.
Пусть V = empty.
Повторить
Если присутствует первое Expression, то
Пусть stmt будет результатом вычисления Statement.
Если stmt.value не равно empty, пусть V = stmt.value.
Если stmt.type не равно break, и stmt.target принадлежит к текущему набору меток, вернуть (normal, V, empty).
Если stmt.type не равно continue || stmt.target не принадлежит к текущему набору меток, то
Если stmt – непредвиденное завершение, вернуть stmt.
Если присутствует второе Expression, то
Пусть incExprRef будет результатом вычисления второго Expression.
Вызвать GetValue(incExprRef). (Это значение не используется.)
Для вычисления IterationStatement : for
(
LeftHandSideExpression in
Expression )
Statement выполняются следующие шаги:
Пусть exprRef будет результатом вычисления Expression.
Пусть experValue будет GetValue(exprRef).
Если experValue равно null или undefined, вернуть (normal, empty, empty).
Пусть obj будет ToObject(experValue).
Пусть V = empty.
Повторить
Пусть P будет именем следующего свойства для obj, у которого атрибут [[Enumerable]] равен true. Если такого свойства нет, вернуть (normal, V, empty).
Пусть lhsRef будет результатом вычисления LeftHandSideExpression (это значение можно вычислять неоднократно).
Вызвать PutValue(lhsRef, P).
Пусть stmt будет результатом вычисления Statement.
Если stmt.value не равно empty, пусть V = stmt.value.
Если stmt.type не равно break, и stmt.target принадлежит к текущему набору меток, вернуть (normal, V, empty).
Если stmt.type не равно continue || stmt.target не принадлежит к текущему набору меток, то
Если stmt – непредвиденное завершение, вернуть stmt.
Для вычисления
IterationStatement : for
(
var
VariableDeclarationNoIn in
Expression )
Statement
выполняются следующие шаги:
Пусть varName будет результатом вычисления VariableDeclarationNoIn.
Пусть exprRef будет результатом вычисления Expression.
Пусть experValue будет GetValue(exprRef).
Если experValue равно null или undefined, вернуть (normal, empty, empty).
Пусть obj будет ToObject(experValue).
Пусть V = empty.
Повторить
Пусть P будет именем следующего свойства для obj, у которого атрибут [[Enumerable]] равен true. Если такого свойства нет, вернуть (normal, V, empty).
Пусть значение varRef будет результатом вычисления varName, как если бы имела место ссылка на идентификатор (11.1.2). Это значение можно вычислять неоднократно.
Вызвать PutValue(varRef, P).
Пусть stmt будет результатом вычисления Statement.
Если stmt.value не равно empty, пусть V = stmt.value.
Если stmt.type не равно break, и stmt.target принадлежит к текущему набору меток, вернуть (normal, V, empty).
Если stmt.type не равно continue || stmt.target не принадлежит к текущему набору меток, то
Если stmt – непредвиденное завершение, вернуть stmt.
Механизм и порядок перечисления свойств (шаг 6.a в первом алгоритме и шаг 7.a во втором алгоритме) не указан. Свойства перечисляемого объекта могут быть удалены во время перечисления. Если свойство, ещё не посещённое при перечислении, удаляется, то оно не будет посещено. Если во время перечисления к объекту добавляются новые свойства, их посещение в процессе текущего перечисления не гарантируется. Одно имя свойства нельзя посетить более одного раза во время перечисления.
Перечисление свойств объекта включает в себя перечисление свойств его прототипа, а также прототипа этого прототипа, и так далее рекурсивно. Однако свойство прототипа не будет перечисляться, если оно "находится в тени" какого-либо предыдущего объекта в цепочке прототипов, который имеет свойство с таким же именем. Чтобы определить, находится ли свойство объекта-прототипа в тени предыдущего объекта в цепочке прототипов, значения атрибутов [[Enumerable]] не учитываются.
ПРИМЕЧАНИЕ См. Примечание к пункту 11.13.1.
Синтаксис
ContinueStatement :
continue
;
continue
[no LineTerminator here] Identifier;
Семантика
Программа будет считаться синтаксически некорректной, если выполняется одно из следующих условий:
Программа содержит инструкцию continue
без необязательного Identifier, не вложенную прямо или косвенно (но без пересечения границ функции) в инструкцию итерации IterationStatement.
Программа содержит инструкцию continue
с необязательным Identifier, но при этом в наборе меток инструкции итерации IterationStatement, в которую вложена упомянутая инструкция continue
(без пересечения границ функции), нет идентификатора Identifier.
Для вычисления ContinueStatement Инструкция continue без идентификатора Identifier выполняются следующие шаги:
Вернуть (continue, empty, empty).
Для вычисления ContinueStatement с необязательным Identifier выполняются следующие шаги:
Вернуть (continue, empty, Identifier).
Синтаксис
BreakStatement :
break
;
break
[no LineTerminator here] Identifier ;
Семантика
Программа будет считаться синтаксически некорректной, если выполняется одно из следующих условий:
Программа содержит инструкцию break
без необязательного Identifier, не вложенную прямо или косвенно (но без пересечения границ функции) в IterationStatement или в SwitchStatement Инструкция switch.
Программа содержит инструкцию break
с необязательным Identifier, но при этом в наборе меток инструкции Statement, в которую вложена упомянутая инструкция break
(без пересечения границ функции), нет идентификатора Identifier.
Для вычисления BreakStatement Инструкция break без идентификатора Identifier выполняются следующие шаги:
Вернуть (break, empty, empty).
Для вычисления BreakStatement Инструкция break с идентификатором Identifier выполняются следующие шаги:
Вернуть (break, empty, Identifier).
Синтаксис
ReturnStatement :
return
;
return
[no LineTerminator here] Expression ;
Семантика
Программа на ECMAScript считается синтаксически некорректной, если она содержит инструкцию return
, которая не является частью тела функции FunctionBody. Инструкция return
заставляет функцию прекратить выполнение и вернуть в вызывающую программу значение. Если выражение Expression пропущено, возвращается значение undefined. В противном случае возвращается значение выражения Expression.
Для вычисления ReturnStatement : return
[no LineTerminator here] Expressionopt;
выполняются следующие шаги:
Если Expression отсутствует, вернуть (return, undefined, empty).
Пусть exprRef будет результатом вычисления Expression.
Вернуть (return, GetValue(exprRef), empty).
Синтаксис
WithStatement :
with
(
Expression )
Statement
Инструкция with
добавляет запись окружения вычисляемого объекта к Лексическому Окружению текущего контекста исполнения. Затем инструкция исполняется с использованием этого приращённого Лексического Окружения. И, наконец, восстанавливается оригинальное Лексическое Окружение.
Семантика
Для вычисления WithStatement : with
(
Expression )
Statement выполняются следующие шаги:
Пусть val будет результатом вычисления Expression.
Пусть oldEnv будет Лексическим Окружением активного контекста исполнения.
Пусть newEnv будует результатом вызова NewObjectEnvironment с передачей в качестве аргументов obj и oldEnv.
Присвоить флагу provideThis для newEnv значение true.
Присвоить LexicalEnvironment текущего контекста исполнения значение newEnv.
Пусть C будет результатом вычисления инструкции Statement, но если при вычислении генерируется исключение, то пусть C будет (throw, V, empty), где V – исключение. (После этого продолжается выполнение кода, как если бы исключение не было сгенерировано).
Присвоить LexicalEnvironment текущего контекста исполнения значение oldEnv.
Вернуть C.
ПРИМЕЧАНИЕ Независимо от того, каким образом управление выходит из вложенной инструкции Statement (то ли обычным способом, то ли в результате непредвиденного завершения или исключения), лексическое окружение LexicalEnvironment всегда восстанавливается до своего начального состояния.
Код в строгом режиме не может содержать инструкцию with. Наличие WithStatement в контексте строгого режима интерпретируется как SyntaxError.
Синтаксис
SwitchStatement :
switch
(
Expression )
CaseBlock
CaseBlock :
{
CaseClausesopt}
{
CaseClausesoptDefaultClause CaseClausesopt}
CaseClauses :
CaseClause
CaseClauses CaseClause
CaseClause :
case
Expression :
StatementListopt
DefaultClause :
default
:
StatementListopt
Семантика
Для вычисления SwitchStatement : switch
(
Expression )
CaseBlock выполняются следующие шаги:
Пусть exprRef будет результатом вычисления Expression.
Пусть R будет результатом вычисления CaseBlock Блок выбора с передачей ему в качестве параметра GetValue(exprRef).
Если R.type равно break, и R.target принадлежит к текущему набору меток, вернуть (normal, R.value, empty).
Вернуть R.
Для вычисления CaseBlock : {
CaseClausesopt}
, которому передаётся входной параметр input, выполняются следующие шаги:
Пусть V = empty.
Пусть A будет списком элементов для CaseClause Выражение выбора по порядку исходного текста.
Пусть searching поиск будет true.
Повторять, пока searching равно true.
Пусть C будет следующим CaseClause в A. Если такого CaseClause нет, вернуть (normal, V, empty).
Пусть clauseSelector Селектор выражения будет результатом вычисления C.
Если input равно clauseSelector согласно определению оператора ===
, то
Присвоить searching значение false.
Если C имеет StatementList, то
Произвести вычисление StatementList для C, и пусть R будет результатом.
Если R – непредвиденное завершение, вернуть R.
Пусть V =R.value.
Повторить
Пусть C будет следующим CaseClause в A. Если такого CaseClause нет, вернуть (normal, V, empty).
Если C имеет StatementList, то
Произвести вычисление StatementList для C, и пусть R будет результатом.
Если R.value не равно empty, то пусть V =R.value.
Если R – непредвиденное завершение, то вернуть (R.type,V,R.target).
Для вычисления CaseBlock : {
CaseClausesoptDefaultClause CaseClausesopt}
которому передаётся входной параметр input, выполняются следующие шаги:
Пусть V = empty.
Пусть A будет списком элементов для CaseClause в первом CaseClauses Выражения выбора по порядку исходного текста.
Пусть B будет списком элементов для CaseClause во втором CaseClauses по порядку исходного текста.
Пусть found найдено будет false.
Повторить, при этом пусть C будет по порядку каждым CaseClause в A
Если found равно false, то
Пусть clauseSelector будет результатом вычисления C.
Если input равно clauseSelector согласно определению оператора ===
, то присвоить found значение true.
Если found равно true, то
Если C имеет StatementList, то
Произвести вычисление StatementList для C, и пусть R будет результатом.
Если R.value не равно empty, то пусть V =R.value.
Если R – непредвиденное завершение, то вернуть (R.type,V, R.target).
Пусть foundInB найдено в B будет false.
Если found равно false, то
Повторять, пока foundInB равно false и пока не были обработаны все элементы в B.
Пусть C будет следующим CaseClause в B.
Пусть clauseSelector будет результатом вычисления C.
Если input равно clauseSelector согласно определению оператора ===
, то
Присвоить foundInB значение true.
Если C имеет StatementList, то
Произвести вычисление StatementList для C, и пусть R будет результатом.
Если R.value не равно empty, то пусть V =R.value.
Если R – непредвиденное завершение, то вернуть (R.type,V, R.target).
Если foundInB равно false, и the DefaultClause Выражение по умолчанию имеет StatementList, то
Произвести вычисление StatementList для DefaultClause, и пусть R будет результатом.
Если R.value не равно empty, то пусть V =R.value.
Если R – непредвиденное завершение, то вернуть (R.type,V,R.target).
Повторить (Обратите внимание, что если был выполнен шаг 7.a.i, то этот цикл не запустится в начале B).
Пусть C будет следующим CaseClause в B. Если такого CaseClause нет, вернуть (normal, V, empty).
Если C имеет StatementList, то
Произвести вычисление StatementList для C, и пусть R будет результатом.
Если R.value не равно empty, то пусть V =R.value.
Если R – непредвиденное завершение, то вернуть (R.type,V,R.target).
Для вычисления CaseClause : case
Expression :
StatementListopt выполняются следующие шаги:
Пусть exprRef будет результатом вычисления Expression.
Вернуть GetValue(exprRef).
ПРИМЕЧАНИЕ При вычислении CaseClause не выполняется ассоциированный StatementList, а просто вычисляется Expression и возвращается значение, с помощью которого алгоритм CaseBlock определяет, какой StatementList нужно начать выполнять.
Синтаксис
LabelledStatement :
Identifier :
Statement
Семантика
Перед инструкцией Statement может находиться метка. Инструкции с метками используются только совместно с инструкциями break
и continue
с метками. Инструкции goto
в языке ECMAScript нет.
Программа на ECMAScript считается синтаксически некорректной, если она содержит LabelledStatement Инструкция с меткой, вложенную в инструкцию LabelledStatement, у которой Identifier аналогичен метке. Это не относится к меткам перед телом объявления функции FunctionDeclaration, которое прямо или косвенно вложено в инструкцию с меткой.
Для вычисления Identifier :
Statement необходимо добавить Identifier к набору меток для Statement, и затем вычислить Statement. Если у LabelledStatement набор меток не пуст, эти метки также добавляются к набору меток для Statement перед его вычислением. Если при вычислении Statement получено (break, V, L), где L равно Identifier, то результат равен (normal, V, empty).
Перед вычислением значения LabelledStatement вложенная инструкция Statement считается имеющей пустой набор меток, если только она не представляет собой IterationStatement или SwitchStatement, и в этом случае она считается имеющей набор меток из одного элемента – empty.
Синтаксис
ThrowStatement:
throw
[no LineTerminator here] Expression ;
Семантика
Для вычисления значения ThrowStatement : throw
[no LineTerminator here] Expression ;
выполняются следующие шаги:
Пусть exprRef будет результатом вычисления Expression.
Вернуть (throw, GetValue(exprRef), empty).
Синтаксис
TryStatement :
try
Block Catchtry
Block Finallytry
Block Catch Finally
Catch :
catch
(
Identifier)
Block
Finally :
finally
Block
Инструкция try
содержит блок кода, в котором может произойти исключительное состояние, например, ошибка времени исполнения или инструкция throw
. Выражение catch
содержит код для обработки исключительных ситуаций. При захвате исключения выражением catch его идентификатор Identifier привязан к этому исключению.
Семантика
Для вычисления TryStatement : try
Block Catch выполняются следующие шаги:
Пусть B будет результатом вычисления Block.
Если B.type не равно throw, вернуть B.
Вернуть результат вычисления Catch с параметром B.
Для вычисления TryStatement : try
Block Finally выполняются следующие шаги:
Пусть B будет результатом вычисления Block.
Пусть F будет результатом вычисления Finally.
Если F.type равно normal, вернуть B.
Вернуть F.
Для вычисления TryStatement : try
Block Catch Finally выполняются следующие шаги:
Пусть B будет результатом вычисления Block.
Если B.type равно throw, то
Пусть C будет результатом вычисления Catch с параметром B.
Иначе, B.type не равно throw,
Пусть C будет B.
Пусть F будет результатом вычисления Finally.
Если F.type равно normal, вернуть C.
Вернуть F.
Для вычисления Catch : catch
(
Identifier)
Block выполняются следующие шаги:
Пусть C будет параметром, который был передан в это порождающее правило.
Пусть oldEnv будет Лексическим Окружением активного контекста исполнения.
Путь catchEnv будет результатом вызова абстрактной операции NewDeclarativeEnvironment с передачей oldEnv в качестве аргумента.
Вызвать конкретный метод CreateMutableBinding для catchEnv, передавая в качестве аргумента строковое значение Identifier.
Вызвать конкретный метод SetMutableBinding для catchEnv, передавая в качестве аргументов Identifier, C и false. Обратите внимание, что последний аргумент в данной ситуации является несущественным.
Присвоить LexicalEnvironment текущего контекста исполнения значение catchEnv.
Пусть B будет результатом вычисления Block.
Присвоить LexicalEnvironment текущего контекста исполнения значение oldEnv.
Вернуть B.
ПРИМЕЧАНИЕ Независимо о того, каким образом управление выходит из блока Block, лексическое окружение LexicalEnvironment всегда восстанавливается до своего начального состояния.
Для вычисления Finally : finally
Block выполняются следующие шаги:
Вернуть результат вычисления Block.
Если TryStatement вместе с Catch встречается в строгом коде, и при этом Identifier для Catch представляет собой либо "eval"
, либо "arguments"
, генерируется SyntaxError.
Синтаксис
DebuggerStatement :
debugger ;
Семантика
При исполнении программы с отладчиком реализация может вызвать точку прерывания при вычислении DebuggerStatement Инструкция отладчика. Если отладчик отсутствует или отключён, эта инструкция не производит наблюдаемого эффекта.
Для вычисления DebuggerStatement : debugger ;
выполняются следующие шаги:
Если присутствует и включен отладчик, заданный реализацией, то
Выполнить действие по отладке, заданное реализацией.
Пусть result будет значением Completion, заданным реализацией.
Иначе
Пусть result будет (normal, empty, empty).
Вернуть result.