Erstens finden Sie drei Codes, die den Umfang erklären
// ============ Beispiel 1 ============== var scope = 'global'; Funktion fn () {alert (Scope); var scope = 'local'; Alert (Scope);} fn (); // Ausgabeergebnis? Alarm (Umfang); // Ausgabeergebnis? // ============ Beispiel 2 ============ var scope = 'global'; Funktion fn () {alert (Scope); Scope = 'lokal'; Alert (Scope);} fn (); // Ausgabeergebnis? Alarm (Umfang); // Ausgabeergebnis? // ============ Beispiel 3 =========== var scope = 'global'; Funktion fn (Scope) {alert (Scope); Scope = 'lokal'; Alert (Scope);} fn (); // Ausgabeergebnis? Alarm (Umfang); // Ausgabeergebnis?Diese drei Codes haben nur einen kleinen Unterschied, aber die Ergebnisse sind völlig unterschiedlich. Beispiel 1 Ausgänge [undefiniert, lokal, global], Beispiel 2 Ausgaben [Global, Lokal, Lokal], Beispiel 3 Ausgaben [undefined, lokal, global]. Wenn Sie nicht richtig antworten können, bedeutet dies, dass Sie die Umfangsmerkmale von JavaScript noch nicht verstanden haben.
Was ist Umfang?
Jemand kann fragen: Was ist der Umfang der Variablen A? Ich fragte später noch einmal: Was ist der Umfang der Funktion A? Was sind die Bereiche von Variablen und Funktionen?
Schauen wir uns zunächst an, was "Umfang" bedeutet. Wenn „Umfang“ abgebaut wird, bedeutet dies „Funktion“ und „Domäne“
Umfang ist der zugängliche Bereich von Variablen und Funktionen oder der Bereich, in dem Variablen oder Funktionen funktionieren.
1.Scope der JavaScript -Funktion:
Der Bereich innerhalb der Funktion ist der Umfang der Funktion, und sowohl Variablen als auch Funktionen können in diesem Bereich auf Operationen zugreifen. Der Bereich außerhalb der äußersten Funktion wird als globaler Bereich bezeichnet, und der Bereich innerhalb der Funktion wird als lokaler Bereich bezeichnet.
2. Umfang der JavaScript -Variablen:
In der Region, in der sich die Variable im Quellcode befindet, ist der Umfang dieser Variablen und auf die Variable in diesem Bereich zugegriffen und betrieben werden. Im globale Umfang definierte Variablen werden als globale Variablen bezeichnet und in der Funktion definierten Variablen als lokale Variablen bezeichnet.
Um einfach zu verstehen, ist JS -Quellcode in Bereiche von Block nach Funktion {} unterteilt. Wenn diese Bereiche ihre Identität ändern, sind sie der Umfang einer bestimmten Funktion oder einer bestimmten Variablen. Der Umfang einer Variablen und der Umfang einer Funktion kann sich auf denselben Bereich im Quellcode beziehen.
Bereichskette
Scope -Kette ist ein Variable- und Funktionssuchmechanismus innerhalb von JavaScript. Es bestimmt den Umfang der Variablen und Funktionen, dh Umfang. Verstehen Sie das Prinzip der Scope -Kette und Sie können die drei Beispiele im vorherigen Artikel verstehen, damit Sie den Grund und den Grund kennen können.
Scope-Kette ist ein Konzept in der Dokumentation von ECMAScript-262. Die JavaScript-Engine wird gemäß der Dokumentation von ECMAScript-262 implementiert. Das Verständnis des Arbeitsprinzips der JavaScript -Engine ist unserem Verständnis der Merkmale von JavaScript förderlich, aber die meisten JS -Programmierer werden die sehr zugrunde liegenden Technologien nicht verstehen. Daher können wir beim Lesen der Dokumentation von ECMAScript-262 eine intuitive Möglichkeit haben, das Arbeitsprinzip der JavaScript-Engine zu simulieren.
In diesem Artikel wird das Prinzip der Bildung von Zielfernrohrketten durch die dritte Ausgabe von ECMascript-262-3 im Jahr 1999 erläutert und mehrere Konzepte wie Ausführungsumgebung, variable Objekte und aktive Objekte, Argumenteobjekte, Zielfernrohrketten usw. einführen. 2009 wurde die fünfte Ausgabe von ECMAScript-262-5th veröffentlicht. Der Unterschied bestand darin, dass die Konzepte wie variable Objekte und aktive Objekte abgesagt wurden und neue Konzepte wie lexikalische Umgebungen und Umgebungsaufzeichnungen eingeführt wurden. Verwechseln Sie also nicht die Konzepte der beiden Versionen.
1. Execution Kontexte
Ausführungskontexte werden ebenfalls in den Ausführungskontext übersetzt. Wenn der Parser in den ausführbaren Code von ECMascript eintritt, tritt der Parser in eine Ausführungsumgebung ein. Die aktive Ausführungsumgebung bildet einen logischen Stapel. Die Ausführungsumgebung oben in diesem logischen Stapel ist die aktuelle Ausführungsumgebung.
Hinweis: Es gibt drei Arten von ausführbarem Code in ECMascript, global, Funktion und Eval. Die globale Umgebung ist globaler ausführbarer Code, und Funktionen sind funktionsführende ausführbare Code. Der Logikstapel ist ein spezielles Datenspeicherformat, das durch "zuerst ein- und aus- und dann nach innen" gekennzeichnet ist. Das Hinzufügen von Daten wird zunächst in die Spitze des Logikstapels geschoben, und das Löschen von Daten muss von oben gelöscht werden.
Variable Objekt, aktives Objekt und Argumenteobjekt
Jede Ausführungsumgebung ist mit einem variablen Objekt zugeordnet. Wenn der Parser in die Ausführungsumgebung eingeht, wird ein variables Objekt erstellt, das Verweise auf Variablen und Funktionen in der aktuellen Ausführungsumgebung enthält.
Variables Objekt ist ein abstraktes Konzept. In verschiedenen Ausführungsumgebungen haben variable Objekte unterschiedliche Identitäten. Bevor der Parser eine Ausführungsumgebung betritt, wird ein globales Objekt erstellt. Wenn der Parser in die globale Ausführungsumgebung eintritt, fungiert das globale Objekt als variables Objekt. Wenn der Parser eine Funktion betritt, wird ein aktives Objekt als variabler Objekt erstellt.
2. Zwei Phasen, wenn der Parser den Code verarbeitet
Wir alle wissen, dass JavaScript Parser den Code nacheinander analysiert, ist es eine Matte? Dies beinhaltet zwei Phasen, wenn der Parser den Code verarbeitet, den Code analysiert und den Code ausführt.
Wenn der Parser in die Ausführungsumgebung eingeht, fügt das variable Objekt Variablen und Funktionen hinzu, die in der Ausführungsumgebung als Eigenschaften deklariert sind. Dies bedeutet, dass die Variablen und Funktionen vor der Deklaration verfügbar sind und der variable Wert nicht definiert ist. Dies ist der Grund für die Förderung von Variablen und Funktionserklärungen (Heizen). Gleichzeitig werden die Bereichskette und dies bestimmt. Dieser Prozess ist das Parsing-Stadium, das allgemein als Vordarstellung bezeichnet wird. Anschließend beginnt der Parser mit der Ausführung des Codes, fügt eine Verweise auf den entsprechenden Wert zur Variablen hinzu und erhält das Ausführungsergebnis. Dieser Prozess ist die Ausführungsstufe.
Nennen wir zwei köstliche Kastanien:
var a = 123; var b = "abc"; Funktion c () {alert ('11 ');}Nach dem Code -Parsen und Ausführen in der obigen globalen Umgebung wird das globale Objekt als variables Objekt verwendet und die folgenden Daten werden gespeichert.
Funktion testfn (a) {var b = "123"; Funktion c () {alert ("ABC"); }} testfn (10);Wenn der Parser in die Funktionsausführungsumgebung eintritt, wird ein aktives Objekt als variables Objekt erstellt. Das aktive Objekt erstellt auch ein Argumenteobjekt. Das Argumenteobjekt ist ein Parameter, das zum Speichern von Parametern eingestellt ist. Aus diesem Grund können wir beim Schreiben von Funktionen Argumente [0] und so weiter verwenden.
3. Bereichskette
Jede Ausführungsumgebung hat eine Zielfernrohrkette, die damit verbunden ist. Es wird definiert, wenn der Parser in die Ausführungsumgebung eintritt. Die Bereichskette ist eine Objektliste, mit der Variablen und Funktionen in jedem variablen Objekt abgerufen werden. Dies stellt sicher, dass die Ausführungsumgebung das Recht hat, auf die Variablen und Funktionen zugreifen zu können. Zum Beispiel ist es eine Kastanie.
var a = '123'; Funktion testfn (b) {var c = 'ABC'; Funktion testfn2 () {var d = 'efg'; Alarm (a); } testfn2 ();} testfn (10);Die Variable A wird in TestFN2 nicht deklariert. Warum kann TestFN2 die globale Variable A aufrufen? Wie ist der gesamte Prozess passiert? Bitte beachten Sie das Bild unten.
Wenn der Parser in die globale Ausführungsumgebung eintritt, finden sich Variablen und Funktionen nur im globalen Objekt, wenn sie aufgerufen werden.
Wenn der Parser in die Umgebung der Testfn -Funktionsausführung eintritt, wird die interne Eigenschaft der Funktion [[Scope]] zuerst im globalen Objekt ausgefüllt, und dann wird das testFN -aktive Objekt dem globalen Objekt hinzugefügt, um eine Bereichskette zu bilden.
Wenn der Parser in die Umgebung der TestFN2 -Funktionsausführung eingeht, wird die interne Eigenschaft der Funktion [[Scope]] zuerst in der übergeordneten Bereichskette gefüllt, und dann wird das aktuelle TestFN2 -Objekt zum vorderen Ende der Bereichskette hinzugefügt, um eine neue Bereichskette zu bilden.
Wenn TestFN2 Variable A aufruft, suchen Sie zunächst im aktuellen testFN2 aktiven Objekt. Wenn es nicht gefunden wird, folgen Sie der Bereichskette nach oben. Wenn es nicht gefunden wird, schauen Sie in der Umfangskette nach. Wenn es nicht gefunden wird, schauen Sie in der Umfangskette nach, bis sie im letzten globalen Objekt gefunden wird. Andernfalls wird ein Fehler gemeldet. Daher können Variablen der externen Umgebung innerhalb der Funktion aufgerufen werden, und Variablen der externen Umgebung können innerhalb der Funktion nicht aufgerufen werden. Dies ist das Prinzip der Umfangsmerkmale.