--- title: Метка slug: Web/JavaScript/Reference/Statements/label tags: - JavaScript - Возможности языка - Метка translation_of: Web/JavaScript/Reference/Statements/label browser-compat: javascript.statements.label ---
Метки используются вместе с операторами {{jsxref("Statements/break", "break")}} и {{jsxref("Statements/continue", "continue")}}. Они выступают в роли идентификатора выражения, на который можно сослаться.
label : statement
label
statement
break
можно использоваться любое блочное выражение,
а с continue
только циклы.Вы можете использовать метки для обозначения циклов, чтобы затем при помощи break
или continue
выходить из цикла или продолжать его работу
с новой итерации соответственно.
Обратите внимание, в JavaScript отсутствует оператор goto
,
вы можете использовать метки только с break
или continue
.
В строгом режиме
использование слова "let
" в качестве имени метки запрещено — вы получите ошибку {{jsxref("SyntaxError")}}
(потому что let
является ключевым словом в новых стандартах JavaScript).
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"
В примере по массиву элементов и массиву тест-функций вычисляется количество элементов, которые проходят все тесты.
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++; }
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
В примере по массиву элементов и массиву тест-функций определяется, все ли элементы проходят все тесты.
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
.
foo: { console.log('привет'); break foo; console.log('эта строка не будет исполнена'); } console.log('мир'); // Вывод: // "привет" // "мир"
Начиная с ECMAScript 2015, объявление функции с меткой допускается только в обычном режиме для совместимости с этой нестандартной, но реализованной в некоторых браузерах, возможностью.
L: function F() {}
Однако в строгом режиме такой код вызовет ошибку {{jsxref("SyntaxError")}}:
'use strict'; L: function F() {} // SyntaxError: functions cannot be labelled
Объявление функций-генераторов с меткой не допускается ни в обычном, ни в строгом режимах:
L: function* F() {} // SyntaxError: generator functions cannot be labelled
{{Compat}}