ReferenceError: kann auf lexikalische Deklaration 'X' vor der Initialisierung nicht zugreifen
Die JavaScript-Ausnahme "kann auf lexikalische Deklaration 'X' vor der Initialisierung nicht zugreifen" tritt auf, wenn auf eine lexikalische Variable zugegriffen wird, bevor sie initialisiert wurde. Dies passiert in jedem Geltungsbereich (global, Modul, Funktion oder Block), wenn let
- oder const
-Variablen aufgerufen werden, bevor der Punkt im Code erreicht wird, an dem sie deklariert sind.
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
Was ist schiefgegangen?
Auf eine lexikalische Variable wurde zugegriffen, bevor sie initialisiert wurde. Dies passiert in jedem Geltungsbereich (global, Modul, Funktion oder Block), wenn Variablen, die mit let
oder const
deklariert sind, aufgerufen werden, bevor der Punkt im Code erreicht wird, an dem sie deklariert sind.
Beachten Sie, dass die Reihenfolge des Zugriffs und der Variablendeklaration entscheidend ist, nicht die Reihenfolge, in der die Anweisungen im Code erscheinen. Für weitere Informationen siehe die Beschreibung der Temporal Dead Zone.
Dieses Problem tritt nicht bei Variablen auf, die mit var
deklariert sind, da diese beim Hoisting mit einem Standardwert von undefined
initialisiert werden.
Dieser Fehler kann auch bei zyklischen Imports 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 die Variable foo
aufgerufen, bevor sie deklariert ist. Zu diesem Zeitpunkt wurde foo
noch nicht mit einem Wert initialisiert, daher führt der Zugriff auf die Variable zu einem Referenzfehler.
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 die importierte Variable a
aufgerufen, aber sie ist nicht initialisiert, da die Auswertung von a.js
durch die Auswertung des aktuellen Moduls b.js
blockiert wird.
// -- 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 darauf zugreifen.
function test() {
// Declaring variable foo
const foo = 33;
console.log(foo); // 33
}
test();
In diesem Beispiel wird die importierte Variable a
asynchron aufgerufen, sodass beide Module ausgewertet werden, bevor auf a
zugegriffen wird.
// -- 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;