[ Web Proxy ]
URL:
Viewing: https://developer.mozilla.org/de/docs/Web/JavaScript/Reference/Statements/label [Back]  [Original]

Bezeichnete Anweisung - JavaScript | MDN

Dieser Inhalt wurde automatisch aus dem Englischen bersetzt, und kann Fehler enthalten. Erfahre mehr ber dieses Experiment.

View in English Always switch to English

Bezeichnete Anweisung

Baseline Weitgehend verfgbar

Diese Funktion ist gut etabliert und funktioniert auf vielen Gerten und in vielen Browserversionen. Sie ist seit Juli 2015 browserbergreifend verfgbar.

Eine bezeichnete Anweisung ist jede Anweisung, die mit einem Bezeichner versehen ist. Sie knnen mit einer innerhalb der bezeichneten Anweisung verschachtelten break- oder continue-Anweisung zu diesem Bezeichner springen.

In diesem Artikel

Probieren Sie es aus

let i, j;

loop1: for (i = 0; i < 3; i++) {
  loop2: for (j = 0; j < 3; j++) {
    if (i === 1 && j === 1) {
      break loop1;
    }
    console.log(`i = ${i}, j = ${j}`);
  }
}

// Expected output:
// "i = 0, j = 0"
// "i = 0, j = 1"
// "i = 0, j = 2"
// "i = 1, j = 0"

Syntax

js
label:
  statement
label

Ein beliebiger JavaScript-Bezeichner, der kein reserviertes Wort ist.

statement

Eine JavaScript-Anweisung. break kann innerhalb jeder bezeichneten Anweisung verwendet werden, und continue kann innerhalb von bezeichneten Schleifenanweisungen verwendet werden.

Beschreibung

Sie knnen ein Label verwenden, um eine Anweisung zu identifizieren, und spter mit einer break- oder continue-Anweisung darauf verweisen. Beachten Sie, dass JavaScript keine goto-Anweisung hat; Sie knnen Labels nur mit break oder continue verwenden.

Jede break- oder continue-Anweisung, die auf label verweist, muss innerhalb der Anweisung enthalten sein, die durch label bezeichnet wird. Betrachten Sie label als eine Variable, die nur im Bereich von statement verfgbar ist.

Wenn eine break label;-Anweisung beim Ausfhren von statement auftritt, endet die Ausfhrung von statement, und die Ausfhrung wird mit der Anweisung unmittelbar nach der bezeichneten Anweisung fortgesetzt.

continue label; kann nur verwendet werden, wenn statement eine der Schleifenanweisungen ist. Wenn eine continue label;-Anweisung whrend der Ausfhrung von statement auftritt, wird die Ausfhrung von statement in der nchsten Iteration der Schleife fortgesetzt. continue; ohne Bezeichner kann nur die innerste Schleife fortsetzen, whrend continue label; es ermglicht, jede gegebene Schleife fortzusetzen, selbst wenn die Anweisung innerhalb anderer Schleifen verschachtelt ist.

Eine Anweisung kann mehrere Bezeichner haben. In diesem Fall sind die Bezeichner alle funktional gleichwertig.

Beispiele

Verwenden von bezeichnetem Continue mit For-Schleifen

js
// The first for statement is labeled "loop1"
loop1: for (let i = 0; i < 3; i++) {
  // The second for statement is labeled "loop2"
  loop2: for (let j = 0; j < 3; j++) {
    if (i === 1 && j === 1) {
      continue loop1;
    }
    console.log(`i = ${i}, j = ${j}`);
  }
}

// Logs:
// 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

Beachten Sie, wie es sowohl "i = 1, j = 1" als auch "i = 1, j = 2" berspringt.

Verwenden von bezeichnetem Break mit For-Schleifen

js
let i, j;

// The first for statement is labeled "loop1"
loop1: for (i = 0; i < 3; i++) {
  // The second for statement is labeled "loop2"
  loop2: for (j = 0; j < 3; j++) {
    if (i === 1 && j === 1) {
      break loop1;
    }
    console.log(`i = ${i}, j = ${j}`);
  }
}

// Logs:
// i = 0, j = 0
// i = 0, j = 1
// i = 0, j = 2
// i = 1, j = 0

Beachten Sie den Unterschied zum vorherigen continue-Beispiel: wenn break loop1 ausgefhrt wird, wird die Ausfhrung der ueren Schleife beendet, sodass keine weiteren Ausgaben nach "i = 1, j = 0" erfolgen; wenn continue loop1 auftritt, wird die Ausfhrung der ueren Schleife in der nchsten Iteration fortgesetzt, sodass nur "i = 1, j = 1" und "i = 1, j = 2" bersprungen werden.

Verwenden einer bezeichneten Continue-Anweisung

Angesichts eines Arrays von Elementen und eines Arrays von Tests zhlt dieses Beispiel die Anzahl der Elemente, die alle Tests bestehen.

js
// Numbers from 1 to 100
const items = Array.from({ length: 100 }, (_, i) => i + 1);
const tests = [
  { pass: (item) => item % 2 === 0 },
  { pass: (item) => item % 3 === 0 },
  { pass: (item) => item % 5 === 0 },
];
let itemsPassed = 0;

itemIteration: for (const item of items) {
  for (const test of tests) {
    if (!test.pass(item)) {
      continue itemIteration;
    }
  }

  itemsPassed++;
}

Beachten Sie, wie die Anweisung continue itemIteration; den Rest der Tests fr das aktuelle Element sowie die Anweisung, die den itemsPassed-Zhler aktualisiert, berspringt und mit dem nchsten Element fortfhrt. Ohne den Einsatz eines Bezeichners msste man stattdessen einen booleschen Indikator verwenden.

js
// Numbers from 1 to 100
const items = Array.from({ length: 100 }, (_, i) => i + 1);
const tests = [
  { pass: (item) => item % 2 === 0 },
  { pass: (item) => item % 3 === 0 },
  { pass: (item) => item % 5 === 0 },
];
let itemsPassed = 0;

for (const item of items) {
  let passed = true;
  for (const test of tests) {
    if (!test.pass(item)) {
      passed = false;
      break;
    }
  }
  if (passed) {
    itemsPassed++;
  }
}

Verwenden einer bezeichneten Break-Anweisung

Angesichts eines Arrays von Elementen und eines Arrays von Tests bestimmt dieses Beispiel, ob alle Elemente alle Tests bestehen.

js
// Numbers from 1 to 100
const items = Array.from({ length: 100 }, (_, i) => i + 1);
const tests = [
  { pass: (item) => item % 2 === 0 },
  { pass: (item) => item % 3 === 0 },
  { pass: (item) => item % 5 === 0 },
];
let allPass = true;

itemIteration: for (const item of items) {
  for (const test of tests) {
    if (!test.pass(item)) {
      allPass = false;
      break itemIteration;
    }
  }
}

Auch hier msste man ohne den Einsatz eines Bezeichners stattdessen einen booleschen Indikator verwenden.

js
// Numbers from 1 to 100
const items = Array.from({ length: 100 }, (_, i) => i + 1);
const tests = [
  { pass: (item) => item % 2 === 0 },
  { pass: (item) => item % 3 === 0 },
  { pass: (item) => item % 5 === 0 },
];
let allPass = true;

for (const item of items) {
  let passed = true;
  for (const test of tests) {
    if (!test.pass(item)) {
      passed = false;
      break;
    }
  }
  if (!passed) {
    allPass = false;
    break;
  }
}

Verwenden eines bezeichneten Blocks mit Break

Sie knnen andere Anweisungen als Schleifen, wie einfache Blcke, bezeichnen, aber nur break-Anweisungen knnen nicht-schleifenlabels referenzieren.

js
foo: {
  console.log("face");
  break foo;
  console.log("this will not be executed");
}
console.log("swap");

// Logs:
// "face"
// "swap"

Bezeichnete Funktionsdeklarationen

Bezeichner knnen nur auf Anweisungen, nicht auf Deklarationen angewendet werden. Es gibt eine veraltete Grammatik, die es erlaubt, Funktionsdeklarationen in nicht-striktem Code zu bezeichnen:

js
L: function F() {}

Im strict mode Code wird dies jedoch einen SyntaxError auslsen:

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

Nicht-einfache Funktionen, wie Generatorfunktionen und asynchrone Funktionen knnen weder im strikten Code noch im nicht-strikten Code gekennzeichnet werden:

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

Der Syntax der bezeichneten Funktionsdeklaration ist veraltet und sollte nicht verwendet werden, selbst in nicht-striktem Code. Sie knnen tatschlich innerhalb des Funktionskrpers nicht zu diesem Bezeichner springen.

Spezifikationen

Spezifikation
ECMAScript 2027 LanguageSpecification
# sec-labelled-statements

Browser-Kompatibilitt

Siehe auch


Web Proxy Viewer  |  New URL  |  Original Page