From 074785cea106179cb3305637055ab0a009ca74f2 Mon Sep 17 00:00:00 2001 From: Peter Bengtsson Date: Tue, 8 Dec 2020 14:42:52 -0500 Subject: initial commit --- .../reference/statements/label/index.html | 179 +++++++++++++++++++++ 1 file changed, 179 insertions(+) create mode 100644 files/ru/web/javascript/reference/statements/label/index.html (limited to 'files/ru/web/javascript/reference/statements/label') diff --git a/files/ru/web/javascript/reference/statements/label/index.html b/files/ru/web/javascript/reference/statements/label/index.html new file mode 100644 index 0000000000..129afe8d3f --- /dev/null +++ b/files/ru/web/javascript/reference/statements/label/index.html @@ -0,0 +1,179 @@ +--- +title: label +slug: Web/JavaScript/Reference/Statements/label +tags: + - JavaScript + - Statement + - Метка +translation_of: Web/JavaScript/Reference/Statements/label +--- +
{{jsSidebar("Statements")}}
+ +

Инструкция метки (label) используется вместе с {{jsxref("Statements/break", "break")}} или {{jsxref("Statements/continue", "continue")}} для альтернативного выхода из цикла. Оно добавляется перед блочным выражением в качестве ссылки, которая может быть использована в дальнейшем.

+ +

{{EmbedInteractiveExample("pages/js/statement-label.html")}}

+ +
+

Примечание: Помеченные циклы используются очень редко. Обычно вместо этого используют вызов функций.

+
+ +

Синтаксис

+ +
label :
+   statement
+
+ +
+
label
+
Любой идентификатор JavaScript, который не является ключевым словом.
+
statement
+
Инструкция. break может быть использован с любой отмеченной инструкцией, а continue только с метками около начала цикла.
+
+ +

Описание

+ +

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

+ +

В JavaScript нет оператора goto, вы можете использовать только метки с break или continue.

+ +

В строгом режиме вы не можете использовать "let" как имя метки. Это генерирует ошибку {{jsxref("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 {{jsxref("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.
{{SpecName('ES5.1', '#sec-12.12', 'Labelled statement')}}{{Spec2('ES5.1')}}
{{SpecName('ES6', '#sec-labelled-statements', 'Labelled statement')}}{{Spec2('ES6')}}
+ +

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

+ +

{{Compat("javascript.statements.label")}}

+ +

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

+ + -- cgit v1.2.3-54-g00ecf