Метка
=====

**Метки** используются вместе с операторами `break` и `continue`. Они выступают в роли идентификатора инструкции, на который можно сослаться.

Интерактивный пример
--------------------

Синтаксис
---------


```js
label:
  statement;
```


`label`

Идентификатор. Любое слово, кроме ключевых и зарезервированных в JavaScript.

`statement`

Инструкция. `break` может быть использован внутри любого блока инструкций с меткой, а с `continue` только внутри циклов.

Описание
--------

Вы можете использовать метки для обозначения циклов, чтобы затем при помощи `break` или `continue` выходить из цикла или продолжать его работу с новой итерации соответственно.

Обратите внимание, в JavaScript *отсутствует* оператор `goto`, вы можете использовать метки только с `break` или `continue`.

В строгом режиме использование слова "`let`" в качестве имени метки запрещено — вы получите ошибку `SyntaxError` (потому что `let` является ключевым словом в новых стандартах JavaScript).

Примеры
-------

### Использование метки с оператором continue в цикле


```js
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

В примере по массиву элементов и массиву тест-функций вычисляется количество элементов, которые проходят все тесты.


```js
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 в цикле


```js
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

В примере по массиву элементов и массиву тест-функций определяется, все ли элементы проходят все тесты.


```js
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`.


```js
foo: {
  console.log("привет");
  break foo;
  console.log("эта строка не будет исполнена");
}
console.log("мир");

// Вывод:
// "привет"
// "мир"
```

### Объявление функций с меткой

Начиная с ECMAScript 2015, объявление функции с меткой допускается только в обычном режиме для совместимости с этой нестандартной, но реализованной в некоторых браузерах, возможностью.


```js
L: function F() {}
```


Однако в строгом режиме такой код вызовет ошибку `SyntaxError`:


```js
"use strict";
L: function F() {}
// SyntaxError: functions cannot be labelled
```


Объявление функций-генераторов с меткой не допускается ни в обычном, ни в строгом режимах:


```js
L: function\* F() {}
// SyntaxError: generator functions cannot be labelled
```

Спецификации
------------

| Specification |
| --- |
| ECMAScript Language Specification # sec-labelled-statements |

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

BCD tables only load in the browser with JavaScript enabled. Enable JavaScript to view data.

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

* `break`
* `continue`