Dieser Inhalt wurde automatisch aus dem Englischen übersetzt, und kann Fehler enthalten.Erfahre mehr über dieses Experiment.
Bezeichnete Anweisung
Baseline Widely available
This feature is well established and works across many devices and browser versions. It’s been available across browsers since Juli 2015.
Einebezeichnete Anweisung ist jedeAnweisung, die mit einem Bezeichner versehen ist. Sie können mit einer innerhalb der bezeichneten Anweisung verschachteltenbreak- odercontinue-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
label: statementlabelEin beliebiger JavaScript-Bezeichner, der keinreserviertes Wort ist.
statementEine JavaScript-Anweisung.
breakkann innerhalb jeder bezeichneten Anweisung verwendet werden, undcontinuekann innerhalb von bezeichneten Schleifenanweisungen verwendet werden.
Beschreibung
Sie können ein Label verwenden, um eine Anweisung zu identifizieren, und später mit einerbreak- odercontinue-Anweisung darauf verweisen. Beachten Sie, dass JavaScriptkeinegoto-Anweisung hat; Sie können Labels nur mitbreak odercontinue verwenden.
Jedebreak- odercontinue-Anweisung, die auflabel verweist, muss innerhalb der Anweisung enthalten sein, die durchlabel bezeichnet wird. Betrachten Sielabel als eine Variable, die nur im Bereich vonstatement verfügbar ist.
Wenn einebreak label;-Anweisung beim Ausführen vonstatement auftritt, endet die Ausführung vonstatement, und die Ausführung wird mit der Anweisung unmittelbar nach der bezeichneten Anweisung fortgesetzt.
continue label; kann nur verwendet werden, wennstatement eine derSchleifenanweisungen ist. Wenn einecontinue label;-Anweisung während der Ausführung vonstatement auftritt, wird die Ausführung vonstatement in der nächsten Iteration der Schleife fortgesetzt.continue; ohne Bezeichner kann nur die innerste Schleife fortsetzen, währendcontinue label; es ermöglicht, 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
// 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 = 2Beachten Sie, wie es sowohl "i = 1, j = 1" als auch "i = 1, j = 2" überspringt.
Verwenden von bezeichnetem Break mit For-Schleifen
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 = 0Beachten Sie den Unterschied zum vorherigencontinue-Beispiel: wennbreak loop1 ausgeführt wird, wird die Ausführung der äußeren Schleife beendet, sodass keine weiteren Ausgaben nach "i = 1, j = 0" erfolgen; wenncontinue loop1 auftritt, wird die Ausführung der äußeren Schleife in der nächsten 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 zählt dieses Beispiel die Anzahl der Elemente, die alle Tests bestehen.
// Numbers from 1 to 100const 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 Anweisungcontinue itemIteration; den Rest der Tests für das aktuelle Element sowie die Anweisung, die denitemsPassed-Zähler aktualisiert, überspringt und mit dem nächsten Element fortfährt. Ohne den Einsatz eines Bezeichners müsste man stattdessen einen booleschen Indikator verwenden.
// Numbers from 1 to 100const 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.
// Numbers from 1 to 100const 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 müsste man ohne den Einsatz eines Bezeichners stattdessen einen booleschen Indikator verwenden.
// Numbers from 1 to 100const 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 können andere Anweisungen als Schleifen, wie einfache Blöcke, bezeichnen, aber nurbreak-Anweisungen können nicht-schleifenlabels referenzieren.
foo: { console.log("face"); break foo; console.log("this will not be executed");}console.log("swap");// Logs:// "face"// "swap"Bezeichnete Funktionsdeklarationen
Bezeichner können nur aufAnweisungen, nicht auf Deklarationen angewendet werden. Es gibt eine veraltete Grammatik, die es erlaubt, Funktionsdeklarationen in nicht-striktem Code zu bezeichnen:
L: function F() {}Imstrict mode Code wird dies jedoch einenSyntaxError auslösen:
"use strict";L: function F() {}// SyntaxError: functions cannot be labelledNicht-einfache Funktionen, wieGeneratorfunktionen undasynchrone Funktionen können weder im strikten Code noch im nicht-strikten Code gekennzeichnet werden:
L: function* F() {}// SyntaxError: generator functions cannot be labelledDer Syntax der bezeichneten Funktionsdeklaration istveraltet und sollte nicht verwendet werden, selbst in nicht-striktem Code. Sie können tatsächlich innerhalb des Funktionskörpers nicht zu diesem Bezeichner springen.
Spezifikationen
| Specification |
|---|
| ECMAScript® 2026 Language Specification> # sec-labelled-statements> |