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: can't access lexical declaration 'X' before initialization

Die JavaScript-Ausnahme „can't access lexical declaration 'X' before initialization“ tritt auf, wenn auf eine lexikalische Variable zugegriffen wird, bevor sie initialisiert wurde. Dies kann in jedem Gültigkeitsbereich (global, Modul, Funktion oder Block) passieren, wenn auf eine mit let oder const deklarierte Variable zugegriffen wird, bevor ihre Deklaration ausgeführt wurde.

Meldung

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

Fehlertyp

ReferenceError

Was ist schiefgelaufen?

Auf eine lexikalische Variable wurde zugegriffen, bevor sie initialisiert wurde. Dies kann in jedem Gültigkeitsbereich (global, Modul, Funktion oder Block) passieren, wenn auf eine mit let oder const deklarierte Variable zugegriffen wird, bevor ihre Deklaration ausgeführt wurde.

Entscheidend ist die Reihenfolge, in der der Zugriff und die Variablendeklaration ausgeführt werden, nicht die Reihenfolge, in der die Anweisungen im Code stehen. Weitere Informationen finden Sie in der Beschreibung der Temporal Dead Zone.

Bei Variablen, die mit var deklariert wurden, tritt dieses Problem nicht auf, da sie beim Hoisting mit dem Standardwert undefined initialisiert werden.

Dieser Fehler kann auch bei zyklischen Importen auftreten, wenn ein Modul eine Variable verwendet, deren Initialisierung 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 wird. Zu diesem Zeitpunkt wurde foo noch nicht mit einem Wert initialisiert. Deshalb löst der Zugriff auf die Variable einen ReferenceError aus.

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, obwohl sie noch nicht initialisiert ist, da 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 eine Variable mit dem Schlüsselwort const, bevor wir darauf zugreifen.

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

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

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