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

View in English Always switch to English

Hoisting

JavaScript Hoisting bezieht sich auf den Prozess, bei dem der Interpreter scheinbar die Deklaration von Funktionen, Variablen, Klassen oder Importen an den Anfang ihres Scopes verschiebt, bevor der Code ausgeführt wird.

Hoisting ist kein Begriff, der normativ in der ECMAScript-Spezifikation definiert ist. Die Spezifikation definiert eine Gruppe von Deklarationen als HoistableDeclaration, aber dies umfasst nur die Deklarationen function, function*, async function und async function*. Hoisting wird oft auch als eine Eigenschaft von var-Deklarationen angesehen, allerdings auf eine andere Weise. Im allgemeinen Sprachgebrauch können die folgenden Verhaltensweisen als Hoisting betrachtet werden:

  1. Die Möglichkeit, den Wert einer Variablen in ihrem Scope vor der Zeile zu verwenden, in der sie deklariert ist. ("Value hoisting")
  2. Die Möglichkeit, auf eine Variable in ihrem Scope vor der Zeile zu verweisen, in der sie deklariert ist, ohne einen ReferenceError auszulösen, aber der Wert ist immer undefined. ("Declaration hoisting")
  3. Die Deklaration der Variablen verursacht Verhaltensänderungen in ihrem Scope vor der Zeile, in der sie deklariert ist.
  4. Die Nebenwirkungen einer Deklaration treten vor der Auswertung des restlichen Codes auf, der sie enthält.

Die vier obigen Funktionsdeklarationen werden mit Verhaltenstyp 1 gehoben; var-Deklarationen werden mit Verhaltenstyp 2 gehoben; let, const und class-Deklarationen (auch als lexikalische Deklarationen bezeichnet) werden mit Verhaltenstyp 3 gehoben; import-Deklarationen werden mit Verhaltenstyp 1 und Typ 4 gehoben.

Einige ziehen es vor, let, const und class als nicht-hoisting zu betrachten, da die zeitliche Sperrzone jegliche Verwendung der Variablen vor ihrer Deklaration strikt verbietet. Diese Auffassung ist akzeptabel, da Hoisting kein allgemein anerkannter Begriff ist. Die zeitliche Sperrzone kann jedoch andere beobachtbare Änderungen in ihrem Scope verursachen, was darauf hindeutet, dass es eine Form des Hoistings gibt:

js
const x = 1;
{
  console.log(x); // ReferenceError
  const x = 2;
}

Wenn die const x = 2-Deklaration überhaupt nicht gehoben wird (also erst in Kraft tritt, wenn sie ausgeführt wird), sollte die Anweisung console.log(x) den x-Wert aus dem äußeren Scope lesen können. Da die const-Deklaration jedoch immer noch den gesamten Scope "verunreinigt", in dem sie definiert ist, liest die console.log(x)-Anweisung den x-Wert aus der const x = 2-Deklaration, die noch nicht initialisiert ist, und löst einen ReferenceError aus. Es kann jedoch nützlicher sein, lexikalische Deklarationen als nicht-hoisting zu charakterisieren, da aus einer utilitaristischen Perspektive das Hoisting dieser Deklarationen keine nennenswerten Funktionen bietet.

Beachten Sie, dass Folgendes keine Form des Hoistings ist:

js
{
  var x = 1;
}
console.log(x); // 1

Hier gibt es kein "Zugriff vor Deklaration"; es liegt einfach daran, dass var-Deklarationen nicht auf Blöcke beschränkt sind.

Weitere Informationen zum Hoisting finden Sie unter: