Синтаксис помеченных операторов
LabelledStatement [Yield, Await, Return] :
LabelIdentifier [?Yield, ?Await] : LabelledItem [?Yield, ?Await, ?Return]
LabelledItem [Yield, Await, Return] :
Statement [?Yield, ?Await, ?Return]
FunctionDeclaration [?Yield, ?Await, ~Default]
Заявление Statement может быть предварено меткой. Помеченные операторы используются только вместе с помеченными операторами break и continue. В ECMAScript нет оператора goto. Заявление Statement может быть частью LabelledStatement, который сам может быть частью LabelledStatement и т. д. Введённые таким образом метки вместе называются «текущим набором меток» (current label set) при описании семантики отдельных операторов.
14.13.1 Статическая семантика: ранние ошибки
LabelledItem : FunctionDeclaration
- Если какой-либо исходный текст соответствует этому правилу, это является синтаксической ошибкой.
Альтернативное определение этого правила приведено в разделе B.3.1.
14.13.2 Статическая семантика: IsLabelledFunction ( stmt )
Абстрактная операция IsLabelledFunction (Является Ли Помеченным Оператором) принимает аргумент stmt. При вызове она выполняет следующие шаги:
1. Если stmt не является LabelledStatement, верните false. 2. Пусть item будет LabelledItem для stmt. 3. Если item является LabelledItem : FunctionDeclaration, верните true. 4. Пусть subStmt будет выражением Statement элемента item. 5. Верните IsLabelledFunction(subStmt).
14.13.3 Семантика времени выполнения: оценка
LabelledStatement : LabelIdentifier : LabelledItem
1. Пусть newLabelSet будет новым пустым Списком. 2. Верните LabelledEvaluation этого LabelledStatement с аргументом newLabelSet.
14.13.4 Семантика времени выполнения: LabelledEvaluation
С параметром labelSet.
BreakableStatement : IterationStatement
1. Пусть stmtResult будет LoopEvaluation для IterationStatement с аргументом labelSet. 2. Если stmtResult.[[Type]] является break, то а. Если stmtResult.[[Target]] является empty, то i. Если stmtResult.[[Value]] является empty, установите для stmtResult значение NormalCompletion(undefined). ii. В противном случае установите для stmtResult значение NormalCompletion(stmtResult.[[Value]]). 3. Вернуть завершение Completion(stmtResult).
BreakableStatement : SwitchStatement
1. Пусть stmtResult будет результатом вычисления SwitchStatement. 2. Если stmtResult.[[Type]] является break, то а. Если stmtResult.[[Target]] является empty, то i. Если stmtResult.[[Value]] является empty, установите для stmtResult значение NormalCompletion(undefined). ii. В противном случае установите для stmtResult значение NormalCompletion(stmtResult.[[Value]]). 3. Вернуть завершение Completion(stmtResult).
BreakableStatement — это оператор, из которого можно выйти с помощью безымянного BreakStatement.
LabelledStatement : LabelIdentifier : LabelledItem
1. Пусть label будет строковым значением StringValue для LabelIdentifier. 2. Пусть newLabelSet будет конкатенацией списка labelSet и «label». 3. Пусть stmtResult будет LabelledEvaluation для LabelledItem с аргументом newLabelSet. 4. Если stmtResult.[[Type]] является break, а SameValue(stmtResult.[[Target]], label) является true, то а. Установите для stmtResult значение NormalCompletion(stmtResult.[[Value]]). 5. Вернуть Завершение Completion(stmtResult).
LabelledItem : FunctionDeclaration
1. Верните результат вычисления FunctionDeclaration.
1. Верните результат оценки Statement.
Только два производства заявления Statement, которые имеют особую семантику для LabelledEvaluation, — это BreakableStatement и LabelledStatement.
Информационные ссылки
Стандарт ECMAScript — Раздел «14.13 Labelled Statements» — https://tc39.es/ecma262/#sec-labelled-statements