--- title: label slug: Web/JavaScript/Reference/Statements/label tags: - JavaScript - Statement - Метка translation_of: Web/JavaScript/Reference/Statements/label ---
Инструкция метки (label) используется вместе с {{jsxref("Statements/break", "break")}} или {{jsxref("Statements/continue", "continue")}} для альтернативного выхода из цикла. Оно добавляется перед блочным выражением в качестве ссылки, которая может быть использована в дальнейшем.
{{EmbedInteractiveExample("pages/js/statement-label.html")}}
Примечание: Помеченные циклы используются очень редко. Обычно вместо этого используют вызов функций.
label : statement
label
statement
break
может быть использован с любой отмеченной инструкцией, а continue
только с метками около начала цикла.Вы можете применять метки для обозначения циклов, чтобы затем при помощи break
или continue
выходить из цикла или продолжать его работу с новой итерации.
В JavaScript нет оператора goto
, вы можете использовать только метки с break
или continue
.
В строгом режиме вы не можете использовать "let
" как имя метки. Это генерирует ошибку {{jsxref("SyntaxError")}} (let is a reserved identifier).
continue
с циклом for
var i, j; loop1: for (i = 0; i < 3; i++) { //Первый цикл, обозначенный меткой "loop1" loop2: for (j = 0; j < 3; j++) { //Второй цикл, обозначенный меткой "loop2" if (i == 1 && j == 1) { continue loop1; } console.log("i = " + i + ", j = " + j); } } // Вывод: // "i = 0, j = 0" // "i = 0, j = 1" // "i = 0, j = 2" // "i = 1, j = 0" // "i = 2, j = 0" // "i = 2, j = 1" // "i = 2, j = 2" // Обратите внимание на пропуск "i = 1, j = 1" и "i = 1, j = 2"
continue
На входе массив элементов и массив функций для проверки, в примере вычисляется количество элементов массива, которые проходят все тесты.
var itemsPassed = 0;
var i, j;
top:
for (i = 0; i < items.length; i++) {
for (j = 0; j < tests.length; j++) {
if (!tests[j].pass(items[i])) {
continue top;
}
}
itemsPassed++;
}
break
var i, j; loop1: for (i = 0; i < 3; i++) { //Первый цикл, обозначенный меткой "loop1" loop2: for (j = 0; j < 3; j++) { //Второй цикл, обозначенный меткой "loop2" if (i == 1 && j == 1) { break loop1; } console.log("i = " + i + ", j = " + j); } } // Вывод: // "i = 0, j = 0" // "i = 0, j = 1" // "i = 0, j = 2" // "i = 1, j = 0" // Обратите внимание на аналогичный пример с continue
break
Дан массив элементов и массив с функциями для проверки, в примере определяется, проходят ли все элементы первого массива все тесты из второго массива.
var allPass = true; var i, j; top: for (i = 0; items.length; i++) for (j = 0; j < tests.length; i++) if (!tests[j].pass(items[i])){ allPass = false; break top; }
Начиная с ECMAScript 2015, помеченные объявления функция являются стандартными для нестрогого режима.
L: function F() {}
Однако, в строгом режиме генерируется ошибка {jsxref("SyntaxError")}}:
In strict mode code, however, this will throw a {{jsxref("SyntaxError")}}:
'use strict';
L: function F() {}
// SyntaxError: functions cannot be labelled
Функции-генераторы не могут быть помечены ни в том, ни в другом режиме:
L: function* F() {}
// SyntaxError: generator functions cannot be labelled
Спецификация | Статус | Комментарии |
---|---|---|
ECMAScript 3-е Издание. | Стандарт | Изначальное определение. Реализован в JavaScript 1.2. |
{{SpecName('ES5.1', '#sec-12.12', 'Labelled statement')}} | {{Spec2('ES5.1')}} | |
{{SpecName('ES6', '#sec-labelled-statements', 'Labelled statement')}} | {{Spec2('ES6')}} |
{{Compat("javascript.statements.label")}}