label

Инструкция метки (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' в этой спецификации.
Стандарт

Совместимость с браузерами

BCD tables only load in the browser

Смотрите также