Инструкция метки (label) используется вместе с break или continue для альтернативного выхода из цикла. Оно добавляется перед блочным выражением в качестве ссылки, которая может быть использована в дальнейшем.
Примечание: Помеченные циклы используются очень редко. Обычно вместо этого используют вызов функций.
Синтаксис
label : statement
label- Любой идентификатор JavaScript, который не является ключевым словом.
statement- Инструкция.
breakможет быть использован с любой отмеченной инструкцией, аcontinueтолько с метками около начала цикла.
Описание
Вы можете применять метки для обозначения циклов, чтобы затем при помощи break или continue выходить из цикла или продолжать его работу с новой итерации.
В JavaScript нет оператора goto, вы можете использовать только метки с break или continue.
В строгом режиме вы не можете использовать "let" как имя метки. Это генерирует ошибку 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 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. |
| ECMAScript 5.1 (ECMA-262) Определение 'Labelled statement' в этой спецификации. |
Стандарт | |
| ECMAScript 2015 (6th Edition, ECMA-262) Определение 'Labelled statement' в этой спецификации. |
Стандарт |
Совместимость с браузерами
| Компьютеры | Мобильные | Server | |||||||||||
|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
label | Chrome Полная поддержка 1 | Edge Полная поддержка 12 | Firefox Полная поддержка 1 | IE Полная поддержка 4 | Opera Полная поддержка Да | Safari Полная поддержка Да | WebView Android Полная поддержка 1 | Chrome Android Полная поддержка 18 | Firefox Android Полная поддержка 4 | Opera Android Полная поддержка Да | Safari iOS Полная поддержка Да | Samsung Internet Android Полная поддержка 1.0 | nodejs Полная поддержка Да |
Легенда
- Полная поддержка
- Полная поддержка