Was ist die JavaScript-Bereichskette (Scope Chain)? Was ist der Effekt?

Fazit zunächst:

Beim Zugriff auf eine Variable innerhalb einer Funktion sucht das Programm (JS-Engine) zunächst im aktuellen Bereich (ob die Variable existiert) und verwendet sie, wenn sie gefunden wird, direkt. Andernfalls wird der Bereich der oberen Ebene Ebene für Ebene durchsucht, bis der globale Bereich gefunden wird. Dieser Suchprozess bildet die Scope-Kette.

In einer Funktion definierte Variablen können auch im Gültigkeitsbereich anderer Funktionen verschachtelt werden und bilden so eine Gültigkeitsbereichskette.

Es stellt sicher, dass auf Variablen im richtigen Umfang zugegriffen und diese verwendet werden. 

Die Bereichskette hat zwei Funktionen. Eine davon ist die gerade erwähnte Variablensuche , die andere ist die Abschlussimplementierung. Über die Bereichskette kann die interne Funktion auf die Variablen der externen Funktion zugreifen und so den Abschluss realisieren.

  • Variablensuche : Wenn eine Variable innerhalb einer Funktion referenziert wird, sucht die JavaScript-Engine nach der Variablen im Gültigkeitsbereich der aktuellen Funktion. Wenn sie diese nicht finden kann, durchsucht sie die Bereichskette nach oben, bis sie den globalen Gültigkeitsbereich findet.
  • Abschlussimplementierung : Über die Bereichskette kann die interne Funktion auf die Variablen der externen Funktion zugreifen und so einen Abschluss (Closure) realisieren, sodass auf den Umfang der externen Funktion auch nach Abschluss der Ausführung der internen Funktion noch verwiesen werden kann.

Spezifische Analyse:

1. Was ist eine Scope-Kette? 

In JavaScript haben Funktionen ein implizites Attribut [[scopes]] . Dieses Attribut wird verwendet, um die Umgebung (Kontext) der aktuellen Funktion zu speichern, wenn sie ausgeführt wird . Da es in der Datenstruktur verkettet ist, wird es auch als Bereichskette bezeichnet . Wir können es als Array verstehen.

function fn() {}
console.dir(fn) // 打印内部结构

2. Interne Struktur des Geltungsbereichs

Der interne Aufbau ist wie folgt: 

Das Scopes- Attribut wird beim Deklarieren der Funktion generiert , beim Aufruf der Funktion aktualisiert und zeichnet die Ausführungsumgebung der aktuellen Funktion auf.

Wenn die Funktion aufgerufen wird, schieben Sie das AO-Objekt der Funktion in [ [Bereiche]]

Sortieren Sie die Bereichskette:

function a() {
  console.dir(a)
  function b() {
    console.dir(b)
    function c() {
      console.dir(c)
    }
    c()
  }
  b()
}
a()

Die Debugging- und Druckergebnisse lauten wie folgt:

 

 

3. Die Rolle der Scope-Kette

Beim Zugriff auf eine Variable oder Funktion wird diese sequentiell in der Bereichskette durchsucht. Überprüfen Sie zunächst, ob Variablen und Funktionen in Ihrem AO vorhanden sind. Wenn diese nicht vorhanden sind, suchen Sie Schicht für Schicht nach oben, bis Sie GO finden.

Die äußere Funktion kann nicht auf die Variablen der inneren Funktion zugreifen; die innere Funktion kann auf die Variablen der äußeren Funktion zugreifen.

        

Im ersten Beispiel gibt aa 111 aus

Im zweiten Beispiel gibt aa 222 aus

4. Zusammenfassung

Die Bildung der Bereichskette wird beim Erstellen der Funktion festgelegt . Sie besteht aus dem Ausführungskontext (Execution Context), in dem die Funktion erstellt wird, und ihrer lexikalischen Umgebung (Lexical Environment).

Zu den Funktionen der Scope-Kette gehören:

  • Variablensuche : Wenn eine Variable innerhalb einer Funktion referenziert wird, sucht die JavaScript-Engine nach der Variablen im Gültigkeitsbereich der aktuellen Funktion. Wenn sie diese nicht finden kann, durchsucht sie die Bereichskette nach oben, bis sie den globalen Gültigkeitsbereich findet.
  • Abschlussimplementierung : Über die Bereichskette kann die interne Funktion auf die Variablen der externen Funktion zugreifen und so einen Abschluss (Closure) realisieren, sodass auf den Umfang der externen Funktion auch nach Abschluss der Ausführung der internen Funktion noch verwiesen werden kann.

Die Bildung der Bereichskette ist eine wichtige Grundlage für die Implementierung des lexikalischen Bereichs (Lexical Scope) in der JavaScript-Sprache. Sie stellt die Zugänglichkeit des internen Bereichs der Funktion für den externen Bereich sicher und bestimmt den sichtbaren Bereich und Lebenszyklus von Variablen in das Programm.

Durch die Bereichskette erkennt JavaScript die Umfangs- und Abschlusseigenschaften von Variablen , wodurch der Code gekapselter und flexibler wird.

Supongo que te gusta

Origin blog.csdn.net/qq_38290251/article/details/134295003
Recomendado
Clasificación