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

View in English Always switch to English

SyntaxError: functions cannot be labelled

Die JavaScript-Ausnahme "functions cannot be labelled" tritt auf, wenn eine function-Deklaration ein label davor hat.

Meldung

SyntaxError: In non-strict mode code, functions can only be declared at top level, inside a block, or as the body of an if statement. (V8-based)
SyntaxError: In strict mode code, functions can only be declared at top level or inside a block. (V8-based)
SyntaxError: Generators can only be declared at the top level or inside a block. (V8-based)
SyntaxError: Async functions can only be declared at the top level or inside a block. (V8-based)

SyntaxError: functions can only be labelled inside blocks (Firefox)
SyntaxError: functions cannot be labelled (Firefox)
SyntaxError: generator functions cannot be labelled (Firefox)
SyntaxError: async function declarations can't appear in single-statement context (Firefox)

SyntaxError: Unexpected keyword 'function'. Function declarations are only allowed inside block statements or at the top level of a program. (Safari)
SyntaxError: Function declarations are only allowed inside blocks or switch statements in strict mode. (Safari)
SyntaxError: Unexpected token '*'. Cannot use generator function declaration in single-statement context. (Safari)
SyntaxError: Unexpected keyword 'function'. Cannot use async function declaration in single-statement context. (Safari)

Fehlertyp

SyntaxError

Was ist schiefgelaufen?

Funktionsdeklarationen sollten niemals mit einem Label versehen sein, da Labels nur auf Anweisungen und nicht auf Deklarationen angewendet werden sollten. Es gibt keine Möglichkeit, tatsächlich zu diesem Label zu springen. Aufgrund einiger alter JavaScript-Syntaxregeln ist die Fehlersituation jedoch komplizierter als nötig:

  • Im Strict-Modus dürfen Funktionsdeklarationen niemals ein Label haben.
  • Im Nicht-Strict-Modus dürfen Funktionsdeklarationen ein Label haben, jedoch nicht, wenn die Funktion die einzige Anweisung einer if-Anweisung ist (was selbst ein veraltetes Merkmal ist).
  • Asynchrone Funktionen, Generator-Funktionen und asynchrone Generator-Funktionen dürfen nie ein Label haben.

Die Fehlermeldung könnte etwas in der Art von "ungültiger Ort für das Erscheinen einer Funktionsdeklaration" sagen, denn wenn der Parser ein Label sieht, erwartet er, dass eine Anweisung folgt, und eine Funktionsdeklaration ist keine Anweisung. Es hängt davon ab, ob die Perspektive des Fehlers ist, dass ein Label nicht von einer Funktion gefolgt werden kann, oder dass eine Funktion nicht von einem Label vorangestellt werden kann.

Beispiele

Falsch geparstes Objektliteral

Obwohl es möglich ist, dass Sie tatsächlich erwarten, dass das Label etwas als Sprungziel dient, beabsichtigen Sie normalerweise nicht, dass es ein Label ist. Der häufigste Fall ist, dass Sie tatsächlich wollen, dass es ein Property-Schlüssel in einem Objektliteral ist:

js
const createObj = () => {
  greet: function greet() { // SyntaxError: functions cannot be labelled
    console.log("Hello");
  }
};

Hier ist {...} tatsächlich kein Objektliteral, sondern der Blockkörper der Pfeilfunktion, so dass greet: zu einem Label wird. Um dies zu beheben, müssen Sie das Objektliteral in Klammern setzen:

js
const createObj = () => ({
  greet: function greet() {
    console.log("Hello");
  },
});

Sie möchten möglicherweise auch die Methodensyntax für Objektliterale verwenden, um dieses Problem zu vermeiden:

js
const createObj = () => ({
  greet() {
    console.log("Hello");
  },
});

Siehe auch