SyntaxError: Funktionen können nicht beschriftet werden

Der JavaScript-Ausnahmefehler "functions cannot be labelled" tritt auf, wenn eine function-Deklaration vor einem Label steht.

Nachricht

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

Was ist schief gelaufen?

Funktionsdeklarationen dürfen niemals beschriftet werden, da Labels nur für Anweisungen gelten sollten, nicht für Deklarationen. Es gibt keine Möglichkeit, tatsächlich zu diesem Label zu springen. Aufgrund einiger veralteter JavaScript-Syntaxregeln ist die Fehlersituation jedoch etwas komplizierter als notwendig:

  • Im Strict-Modus dürfen Funktionsdeklarationen niemals beschriftet werden.
  • Im Nicht-Strict-Modus dürfen Funktionsdeklarationen beschriftet werden, aber nicht, wenn die Funktion die einzige Anweisung einer if-Anweisung ist (was selbst eine veraltete Funktion ist).
  • Asynchrone Funktionen, Generatorfunktionen und asynchrone Generatorfunktionen dürfen niemals beschriftet werden.

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

Beispiele

Falsch geparstes Objektliteral

Während es möglich ist, dass Sie tatsächlich erwarten, dass das Label etwas in der Richtung wie ein Sprungziel tut, beabsichtigen Sie normalerweise nicht, dass es ein Label ist. Der häufigste Fall ist, dass Sie tatsächlich möchten, dass es ein Eigenschaftsschlü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, daher wird greet: zu einem Label. 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