| [ Web Proxy ] |
| Viewing: https://developer.mozilla.org/de/docs/Web/JavaScript/Reference/Statements/label | [Back] [Original] |
Get to know MDN better
Dieser Inhalt wurde automatisch aus dem Englischen bersetzt, und kann Fehler enthalten. Erfahre mehr ber dieses Experiment.
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.
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"
label:
statement
labelEin beliebiger JavaScript-Bezeichner, der kein reserviertes Wort ist.
statementEine JavaScript-Anweisung. break kann innerhalb jeder bezeichneten Anweisung verwendet werden, und continue kann innerhalb von bezeichneten Schleifenanweisungen verwendet werden.
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.
// 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.
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.
Angesichts eines Arrays von Elementen und eines Arrays von Tests zhlt dieses Beispiel die Anzahl der Elemente, die alle Tests bestehen.
// 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.
// 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++;
}
}
Angesichts eines Arrays von Elementen und eines Arrays von Tests bestimmt dieses Beispiel, ob alle Elemente alle Tests bestehen.
// 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.
// 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;
}
}
Sie knnen andere Anweisungen als Schleifen, wie einfache Blcke, bezeichnen, aber nur break-Anweisungen knnen nicht-schleifenlabels referenzieren.
foo: {
console.log("face");
break foo;
console.log("this will not be executed");
}
console.log("swap");
// Logs:
// "face"
// "swap"
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:
L: function F() {}
Im strict mode Code wird dies jedoch einen SyntaxError auslsen:
"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:
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.
| Spezifikation |
|---|
| ECMAScript 2027 LanguageSpecification # sec-labelled-statements |
Der Bauplan fr ein besseres Internet.
Teile dieses Inhalts sind 19982026 von einzelnen mozilla.org-Mitwirkenden. Inhalte sind verfgbar unter einer Creative-Commons-Lizenz.
| Web Proxy Viewer | New URL | Original Page |