Start · Sprachen · JavaScript · Referenz · Labeled statement

Labeled statement

Anweisung

Ein <code>labeled statement</code> versieht eine beliebige Anweisung mit einem Bezeichner, auf den <code>break</code> oder <code>continue</code> gezielt verweisen können.

seit JavaScript ES1 Kategorie: syntax

Signatur

label: statement

Beschreibung

Ein Labeled Statement (beschriftete Anweisung) besteht aus einem frei wählbaren Bezeichner (Label), gefolgt von einem Doppelpunkt und einer beliebigen JavaScript-Anweisung. Das Label selbst hat keinen Einfluss auf den Programmablauf – es dient ausschließlich als Zielmarke für die Schlüsselwörter break und continue.

Am häufigsten werden Labels in verschachtelten Schleifen eingesetzt: Mit break labelName kann man eine äußere Schleife direkt verlassen, ohne dass man Hilfsvariablen oder mehrfache break-Anweisungen benötigt. Mit continue labelName springt man zum nächsten Durchlauf der beschrifteten (äußeren) Schleife, anstatt nur die innere zu überspringen.

Labels gelten im gesamten Gültigkeitsbereich des Blocks, in dem sie deklariert sind. Doppelte Label-Namen im gleichen Scope sind verboten und führen zu einem SyntaxError. Labels sind kein Sprungbefehl im Stil von GOTO – sie funktionieren ausschließlich zusammen mit break/continue.

Obwohl Labels ein legitimes Sprachmittel sind, sollte man sie sparsam einsetzen. Häufig lässt sich die Logik durch das Auslagern des Schleifenkörpers in eine eigene Funktion (und den Einsatz von return) klarer ausdrücken.

Parameter

Name Typ Default Beschreibung
$label Pflicht string Ein gültiger JavaScript-Bezeichner (kein reserviertes Wort), der als Name der Markierung dient.
$statement Pflicht statement Eine beliebige JavaScript-Anweisung (z. B. for, while, switch, ein Block { } oder eine einfache Anweisung), die mit dem Label verknüpft wird.

Rückgabewert

Typ
void
Beschreibung
Ein Labeled Statement erzeugt keinen Rückgabewert – es steuert lediglich den Kontrollfluss.

Beispiele

Äußere Schleife mit break verlassen

// Ohne Label müsste man eine Hilfsvariable setzen.
// Mit Label verlässt break die äußere for-Schleife direkt.

outerLoop: for (let i = 0; i < 4; i++) {
  for (let j = 0; j < 4; j++) {
    if (i === 2 && j === 1) {
      console.log(`break bei i=${i}, j=${j}`);
      break outerLoop; // verlässt BEIDE Schleifen
    }
    console.log(`i=${i}, j=${j}`);
  }
}

console.log('Fertig');
i=0, j=0 i=0, j=1 i=0, j=2 i=0, j=3 i=1, j=0 i=1, j=1 i=1, j=2 i=1, j=3 i=2, j=0 break bei i=2, j=1 Fertig

Äußere Schleife mit continue überspringen

// continue mit Label springt zum nächsten Durchlauf der
// äußeren Schleife und überspringt den Rest der inneren.

const matrix = [
  [1, 2, -1, 4],
  [5, 6,  7, 8],
  [9, -2, 11, 12],
];

const result = [];

rowLoop: for (let row = 0; row < matrix.length; row++) {
  for (let col = 0; col < matrix[row].length; col++) {
    if (matrix[row][col] < 0) {
      // Zeile mit negativem Wert überspringen
      console.log(`Zeile ${row} übersprungen (negativer Wert an Spalte ${col})`);
      continue rowLoop;
    }
    result.push(matrix[row][col]);
  }
}

console.log('Gesammelte Werte:', result);
Zeile 0 übersprungen (negativer Wert an Spalte 2) Zeile 2 übersprungen (negativer Wert an Spalte 1) Gesammelte Werte: [5, 6, 7, 8]

Labeled Block mit break (ohne Schleife)

// Labels funktionieren auch auf einfachen Blöcken –
// break springt dann ans Ende des beschrifteten Blocks.

validation: {
  const user = { name: 'Ada', age: 15 };

  if (!user.name) {
    console.log('Kein Name.');
    break validation;
  }
  if (user.age < 18) {
    console.log('Nicht volljährig – Validierung abgebrochen.');
    break validation;
  }
  console.log('Benutzer ist gültig.'); // wird nicht erreicht
}

console.log('Nach dem Block.');
Nicht volljährig – Validierung abgebrochen. Nach dem Block.

// Wichtig · Fallstricke

Fallstricke & Hinweise:

  • Kein GOTO: Labels erlauben keinen freien Sprung an eine beliebige Stelle im Code. Sie wirken ausschließlich in Kombination mit break und continue.
  • Doppelte Labels: Zwei Labels mit demselben Namen im selben Scope erzeugen einen SyntaxError.
  • continue nur bei Schleifen: continue labelName ist nur erlaubt, wenn das Label auf eine Schleifenanweisung (for, while, do…while) zeigt – nicht auf einfache Blöcke.
  • Strict Mode: Labels dürfen auch im Strict Mode verwendet werden; jedoch darf der Label-Name kein reserviertes Wort sein (z. B. let, static sind in manchen Kontexten verboten).
  • Lesbarkeit: Tief verschachtelte Labels erschweren die Wartbarkeit. Als Alternative empfiehlt sich das Auslagern in eine Hilfsfunktion, die mit return frühzeitig beendet wird.
  • Browser-Kompatibilität: Labeled Statements sind seit jeher (ES1) Teil der Sprache und werden in allen Umgebungen vollständig unterstützt.