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

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

Update compatibility data on GitHub
КомпьютерыМобильныеServer
ChromeEdgeFirefoxInternet ExplorerOperaSafariAndroid webviewChrome для AndroidFirefox для AndroidOpera для AndroidSafari on iOSSamsung InternetNode.js
labelChrome Полная поддержка 1Edge Полная поддержка 12Firefox Полная поддержка 1IE Полная поддержка 4Opera Полная поддержка ДаSafari Полная поддержка ДаWebView Android Полная поддержка 1Chrome Android Полная поддержка 18Firefox Android Полная поддержка 4Opera Android Полная поддержка ДаSafari iOS Полная поддержка ДаSamsung Internet Android Полная поддержка 1.0nodejs Полная поддержка Да

Легенда

Полная поддержка  
Полная поддержка

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