Метка
Baseline Widely available
This feature is well established and works across many devices and browser versions. It’s been available across browsers since July 2015.
Метки используются вместе с операторами break
и continue
. Они выступают в роли идентификатора инструкции, на который можно сослаться.
Интерактивный пример
Синтаксис
Описание
Вы можете использовать метки для обозначения циклов, чтобы затем при помощи break
или continue
выходить из цикла или продолжать его работу с новой итерации соответственно.
Обратите внимание, в JavaScript отсутствует оператор goto
, вы можете использовать метки только с break
или continue
.
В строгом режиме использование слова "let
" в качестве имени метки запрещено — вы получите ошибку SyntaxError
(потому что let
является ключевым словом в новых стандартах JavaScript).
Примеры
Использование метки с оператором continue в цикле
let 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
В примере по массиву элементов и массиву тест-функций вычисляется количество элементов, которые проходят все тесты.
let itemsPassed = 0;
let 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 в цикле
let 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
В примере по массиву элементов и массиву тест-функций определяется, все ли элементы проходят все тесты.
let allPass = true;
let i, j;
top: for (i = 0; i < items.length; i++) {
for (j = 0; j < tests.length; j++) {
if (!tests[j].pass(items[i])) {
allPass = false;
break top;
}
}
}
Использование метки для блока инструкций с break
Метки можно использовать для обычных блоков кода, но только с оператором break
.
foo: {
console.log("привет");
break foo;
console.log("эта строка не будет исполнена");
}
console.log("мир");
// Вывод:
// "привет"
// "мир"
Объявление функций с меткой
Начиная с ECMAScript 2015, объявление функции с меткой допускается только в обычном режиме для совместимости с этой нестандартной, но реализованной в некоторых браузерах, возможностью.
L: function F() {}
Однако в строгом режиме такой код вызовет ошибку SyntaxError
:
"use strict";
L: function F() {}
// SyntaxError: functions cannot be labelled
Объявление функций-генераторов с меткой не допускается ни в обычном, ни в строгом режимах:
L: function* F() {}
// SyntaxError: generator functions cannot be labelled
Спецификации
Specification |
---|
ECMAScript Language Specification # sec-labelled-statements |
Совместимость с браузерами
BCD tables only load in the browser