Scope & Context in JavaScript

Der Gültigkeitsbereich in JavaScript...

...bezieht sich auf den aktuellen Codekontext, der die Zugänglichkeit von Variablen für JavaScript bestimmt.

Der Scope ermöglicht es Variablen mit demselben Namen zu erstellen, ohne dass sie miteinander kollidieren. Er verhindert zudem, dass äußere Gültigkeitsbereiche auf innere Gültigkeitsbereiche zugreifen.

Zuerst: Was ist ein Lexical Environment?

Das Lexical Environment ist der lokale Speicher gebündelt mit dem Lexical Environment seines Parents. Das bedeutet: Eine lexikalische Umgebung ist eine Datenstruktur, die eine Zuordnung von Kennungsvariablen enthält.

Jedes Mal, wenn die JavaScript-Engine...

...einen Ausführungskontext zum Ausführen der Funktion oder des globalen Codes erstellt, erstellt sie auch eine neue lexikalische Umgebung. Dies geschieht, um die in dieser Funktion, während der Ausführung dieser Funktion, definierte Variable zu speichern. Eine lexikalische Umgebung besteht aus zwei Komponenten:

Umgebungsdatensatz:
Dies ist der eigentliche Ort, an dem die Variablen- und Funktionsdeklarationen gespeichert werden.

Verweis auf die äußere Umgebung:
Bedeutet, dass sie Zugriff auf ihre äußere (übergeordnete) lexikalische Umgebung hat.


Die zwei Arten von Scopes

In Javascript gibt es zwei Arten von Gültigkeitsbereichen:

Context in JavaScript

Wenn der Code zum ersten Mal ausgeführt wird, wird Speicherplatz für verschiedene Kontexte eingerichtet. Zum einen der globale Ausführungskontext. Der Ausführungskontext ist eine Umgebung, in der Javascript-Code ausgewertet und ausgeführt wird. Zum anderen der Funktionsausführungskontext, welcher bei jedem Funktionsaufruf erstellt wird.


Jeder dieser Kontexte hat auch eine Scope-Chain(Gültigkeitsbereichskette). Die Scope-Chain ist im Grunde eine "Kette von Verweisen" auf Objekte, die Verweise auf Werte (und andere Bereiche) enthalten, auf die in diesem Ausführungskontext verwiesen werden kann.

Wenn wir versuchen, auf eine Variablen in einer Funktion zuzugreifen,..

  1. ...überprüft die JS-Engine zuerst die lokale Gültigkeitskette.
  2. Wenn der Wert im lokalen Scope vorhanden ist, super!
  3. Falls der Wert im lokalen Scope nicht vorhanden ist, "klettert" die Engine die Scope-Kette hinauf.
  4. Sie sucht nun im äußeren Gültigkeitsbereich, auf den der lokale
  5. Gültigkeitsbereich eine Referenz hat, z.B. ein globales Objekt (node - global / browser - window).
  6. Man kann es vergleichen mit der Vererbung: Auf die Werte, die im äußeren Scope liegen, kann man problemlos (ähnlich wie Parents) zugreifen, aber nicht auf die Werte der Inneren (Children) Scopes.