Die Verschachtelung von Bereichen bildet eine Bereichskette und die Verschachtelung von Funktionen bildet einen Abschluss. Abschlüsse und Bereichsketten sind eines der wichtigen Merkmale, die JavaScript von anderen Sprachen unterscheiden.
Bereich
Es gibt zwei Arten von Bereichen in JavaScript: Funktionsbereich und globaler Bereich.
In einer Funktion deklarierte Variablen und die Parameter der Funktion haben denselben Gültigkeitsbereich, d. h. den Funktionsbereich. Ein einfaches Beispiel für den Funktionsumfang:
Im Gegensatz zu anderen blockbasierten Sprachen wie C wird hier immer 2 zurückgegeben.
Globaler Bereich für Browser kann als Fensterobjekt verstanden werden (Node.js ist global):
Sowohl die Variable bar als auch die Funktion foo gehören zum globalen Bereich und sind beide Attribute von window.
Bereichskette
Wenn Sie in JavaScript auf eine Variable zugreifen, beginnt diese mit lokalen Variablen und Parametern und durchläuft den Bereich Schritt für Schritt, bis sie den globalen Bereich erreicht.
Abschluss
In einer Funktion wird das Definieren einer anderen Funktion als Funktionsverschachtelung bezeichnet. Die Verschachtelung von Funktionen bildet einen Abschluss.Abschlüsse und Bereichsketten ergänzen sich gegenseitig. Durch die Verschachtelung von Funktionen werden nicht nur mehrere Bereiche in einer Kettenbeziehung erstellt, sondern auch ein Abschluss gebildet.
Code kopieren
Eingebettete Funktionen können jedoch auf Parameter und Variablen externer Funktionen zugreifen
Mit anderen Worten: Eingebettete Funktionen enthalten den Umfang der externe Funktion Schauen wir uns das zuvor erwähnte Beispiel einer Bereichskette an, dieses Mal aus der Perspektive des Abschlusses:
Code kopieren
Die innerste Funktion kann auf alle intern und extern definierten Variablen zugreifen. Die vorletzte Funktion kann nicht auf die innerste Variable zugreifen. Gleichzeitig hat die Zuweisungsoperation von Scope = 3 in der innersten Ebene keinen Einfluss auf die gleichnamige externe Variable.
Lassen Sie uns den Abschluss aus einem anderen Blickwinkel verstehen:
Jedes Mal, wenn eine externe Funktion aufgerufen wird, wird die eingebettete Funktion einmal erstellt.
Beim Erstellen wird der Umfang der externen Funktion (einschließlich aller lokalen Variablen, Parameter usw. im Kontext) zu jeder eingebetteten Funktion Objekt. Teil des internen Zustands, auch nachdem die externe Funktion die Ausführung abgeschlossen und beendet hat
Siehe das folgende Beispiel:
Wir erhalten zweimal „2“ anstelle der erwarteten „1“ und „2“. Dies liegt daran, dass die Variable, auf die die beiden Funktionen in der Liste zugreifen, dieselbe Variable im oberen Bereich ist.
Ändern wir den Code, um Schließungen zu verwenden, um dieses Problem zu lösen:
Die äußere „Funktion zur sofortigen Ausführung“ erhält eine Parametervariable i, die in der Form des Parameters j innerhalb ihrer Funktion vorhanden ist. Sie verweist auf dieselbe Referenz wie der Name j in der zurückgegebenen inneren Funktion. Nachdem die äußere Funktion ausgeführt und beendet wurde, wird der Parameter j (sein Wert ist zu diesem Zeitpunkt der aktuelle Wert von i) Teil des Status seiner inneren Funktion und wird gespeichert.