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

View in English Always switch to English

ReferenceError: kann auf die lexikalische Deklaration 'X' vor der Initialisierung nicht zugreifen

Die JavaScript-Ausnahme "can't access lexical declaration 'X' before initialization" tritt auf, wenn auf eine lexikalische Variable zugegriffen wurde, bevor sie initialisiert wurde. Dies geschieht in jedem Gültigkeitsbereich (global, Modul, Funktion oder Block), wenn let- oder const-Variablen vor der Stelle, an der sie deklariert sind, ausgeführt werden.

Nachricht

ReferenceError: Cannot access 'X' before initialization (V8-based)
ReferenceError: can't access lexical declaration 'X' before initialization (Firefox)
ReferenceError: Cannot access uninitialized variable. (Safari)

Fehlerart

ReferenceError

Was ist schiefgelaufen?

Auf eine lexikalische Variable wurde zugegriffen, bevor sie initialisiert wurde. Dies geschieht in jedem Gültigkeitsbereich (global, Modul, Funktion oder Block), wenn Variablen, die mit let oder const deklariert sind, vor der Stelle, an der sie deklariert sind, ausgeführt werden.

Beachten Sie, dass die Ausführungsreihenfolge von Zugriff und Variablendeklaration entscheidend ist, nicht die Reihenfolge, in der die Anweisungen im Code erscheinen. Weitere Informationen finden Sie in der Beschreibung der Temporal Dead Zone.

Dieses Problem tritt nicht bei Variablen auf, die mit var deklariert wurden, da sie mit einem Standardwert von undefined initialisiert werden, wenn sie gehoben werden.

Dieser Fehler kann auch bei zyklischen Importen auftreten, wenn ein Modul eine Variable verwendet, die davon abhängt, dass das Modul selbst ausgewertet wird.

Beispiele

Ungültige Fälle

In diesem Fall wird auf die Variable foo zugegriffen, bevor sie deklariert ist. Zu diesem Zeitpunkt wurde foo noch nicht mit einem Wert initialisiert, sodass der Zugriff auf die Variable einen Referenzfehler auslöst.

js
function test() {
  // Accessing the 'const' variable foo before it's declared
  console.log(foo); // ReferenceError: foo is not initialized
  const foo = 33; // 'foo' is declared and initialized here using the 'const' keyword
}

test();

In diesem Beispiel wird auf die importierte Variable a zugegriffen, die allerdings nicht initialisiert ist, weil die Auswertung von a.js durch die Auswertung des aktuellen Moduls b.js blockiert wird.

js
// -- a.js (entry module) --
import { b } from "./b.js";

export const a = 2;

// -- b.js --
import { a } from "./a.js";

console.log(a); // ReferenceError: Cannot access 'a' before initialization
export const b = 1;

Gültige Fälle

Im folgenden Beispiel deklarieren wir korrekt eine Variable mit dem const-Schlüsselwort, bevor wir auf sie zugreifen.

js
function test() {
  // Declaring variable foo
  const foo = 33;
  console.log(foo); // 33
}
test();

In diesem Beispiel wird auf die importierte Variable a asynchron zugegriffen, sodass beide Module ausgewertet werden, bevor der Zugriff auf a erfolgt.

js
// -- a.js (entry module) --
import { b } from "./b.js";

export const a = 2;

// -- b.js --
import { a } from "./a.js";

setTimeout(() => {
  console.log(a); // 2
}, 10);
export const b = 1;

Siehe auch