Der sogenannte Umfang kann einfach als Bereich (Bereich) verstanden werden, das gelesen und geschrieben werden kann. Einige Schüler mit Erfahrung in JS können sagen: "JS hat keinen Block-Level-Bereich". Neben dem globalen Umfang können nur Funktionen Scopes erstellen. Ein Vorteil des Umfangs ist, dass es Variablen isolieren kann.
Wir verwenden einige Beispiele, um uns zu helfen, den Umfang in JS zu verstehen.
Alarm (a); var a = 1;
Wenn Schüler, die den Umfang überhaupt nicht kennen, sagen, dass Alarm 1 ist oder einen Fehler meldet; Aber es ist tatsächlich undefiniert;
Sprechen wir zuerst über einige Vorbereitungen, bevor JS die Codezeile nach Zeile analysiert.
Vor dem Lesen der Codezeile für Zeile wird JS einige "Vorbekämpfung" arbeiten und einige "kleine Dinge" im Voraus finden. Natürlich wird "JS Parser" einige Daten beiläufig nicht finden, sie findet sie nach VAR, Funktion und Parametern.
"JS Parser" ist relativ "faul". Bevor er den Code offiziell ausführt, wird die von VAR und Defined, dh var a = undefinierte Variable, die Variable erklärt; Es wird die gesamte Funktion als Codeblock betrachten, unabhängig davon, wie viel Code es gibt. Die Parameter werden in den Beispielen später gesagt.
Nachdem alle Vorbereitungen durchgeführt wurden, beginnt der "JS -Parser" die Codelinie für Zeile auszuführen. Lassen Sie uns nun das Beispiel analysieren, das wir begonnen haben, und es ist leicht zu verstehen, warum es undefiniert ist.
Schauen wir uns das folgende Beispiel an
Alarm (a); var a = 1; Alarm (a); var a = 2; Alarm (a);
Lassen Sie uns dies ein wenig analysieren
Erster "Vorbereitung": Der Parser sucht nach Var
Beim Lesen der zweiten Zeile a = undefiniert;
Beim Lesen der vierten Zeile immer noch a = undefiniert;
Formelle zeilenweise Ausführung von Code:
Erste Linie Alarm: undefiniert
Die zweite Zeile a = 1;
Zeile 3 Alarm: 1;
Die fünfte Elementalarm: 2
Schauen wir uns das Beispiel unten an
Alarm (a); var a = 1; Alarm (a); Funktion a () {alert (2); } alert (a); var a = 3; Alarm (a); Funktion a () {alert (4); } alert (a);Lassen Sie uns so etwas für Stück analysieren
Erstens "Pre-Parse": Der Parser sucht nach der VAR-Funktion;
Beim Lesen der zweiten Zeile a = undefiniert;
Beim Lesen der vierten Zeile a = Funktion a () {alert (2);} // alle Funktionen sind der gesamte Funktionsblock, bevor er den Code offiziell ausführt; Wenn eine Variable auf einen doppelten Namen stößt, bleibt nur eine Variable übrig. Wenn die Variable und die Funktion doppelter Name sind, bleibt nur die Funktion übrig.
Beim Lesen der sechsten Zeile a = Funktion a () {alert (2);}
Beim Lesen der achten Zeile a = Funktion a () {alert (4);}
Formelle zeilenweise Ausführung von Code:
Erste Zeilenalarm: Funktion a () {alert (4);}
Die zweite Zeile a = 1; // Der Ausdruck kann den Wert vor dem Parzieren ändern!
Zeile 3 Alarm: 1;
Die vierte Funktionslinie wird nicht aufgerufen, überspringen;
Die fünfte Elementalarm: 1;
Zeile sechs a = 3;
Zeile 7 Alarm: 3
Die achte Zeilenfunktion wird nicht aufgerufen, überspringen;
Zeile 9 Alarm: 3
Wie in der Abbildung gezeigt:
Sehen Sie weiterhin das Beispiel:
var a = 1; Funktion fn1 () {alert (a); // undefined var a = 2;} fn1 (); Alarm (a); // 1Erste "Vorbereitung": Der Parser sucht nach der VAR -Funktion
Beim Lesen der ersten Zeile a = undefiniert;
Beim Lesen der zweiten Zeile fn1 = Funktion fn1 () {alert (2); var a = 2;}
Formale Zeilen-für-Linie-Ausführung von Code: Erste Zeile A = 1;
Geben Sie den Funktionsumfang der sechsten Zeile in den Funktionsbereich ein und geben Sie dennoch in den Funktionsbereich vor und führen Sie es dann für Zeile aus.
In der Funktion vorbereiten: a = undefiniert;
Ausführung: Alarm: undefiniert;
a = 2; // a zu diesem Zeitpunkt ist nur ein im Funktionsumfang und wirkt sich nicht im globalen Auswirkungen auf A aus
Die Funktion wird ausgeführt und kehrt zum globalen Bereich zurück.
Zeile sieben Alarm: 1;
weitermachen:
var a = 1; Funktion fn1 () {alert (a); // 1 a = 2;} fn1 (); Alarm (a); // 2Der einzige Unterschied zwischen dem obigen Beispiel besteht darin, dass a in der Funktion keine VAR hat und nur die Schlüsselpunkte analysiert.
In der dritten Linie Alert (a) sucht der "Parser" im Funktionsbereich, da es in der Funktion kein VaR A gibt, nach einem Umfang der oberen Ebene des Rahmens der Funktion (die Bestimmung des oberen und unteren Verhältnisses abhängig von der Funktion, die die Funktion erstellt wurde und unter welchem Umfang erstellt wurde. Zu diesem Zeitpunkt ist die obere Ebene der Funktion der globale Bereich. Im globalen Bereich, a = 1, zu diesem Zeitpunkt, der dritten Zeile-Alarm: 1 und dann der vierten Zeile, weist A = 2 den Wert zu, dennoch gibt es kein A im Funktionsbereich. Finden Sie also einen Umfang der oberen Ebene.
Dieser Punkt muss klar verstanden werden und auf den Unterschied zwischen var achten oder nicht.
Nächste:
var a = 1; Funktion fn1 (a) {alert (a); // undefined a = 2; } fn1 (); Alarm (a); // 1Der Unterschied zwischen diesem und dem vorherigen Beispiel besteht darin, dass es einen zusätzlichen Parameter gibt. Die Funktion des Parameters entspricht einer lokalen Variablen, dh bei der Vorparingung in der Funktion gibt es var a = undefiniert. Daher ist die dritte Linie aufmerksam: undefiniert und die vierte Zeile A = 2 ändert das A im Funktionsbereich, was A im globalen Kontext nicht beeinflusst. Die siebte Linie Alarm: 1;
Dann:
var a = 1; Funktion fn1 (a) {alert (a); // 1a = 2;} fn1 (a); alarm (a); // 1Dieses Beispiel unterscheidet sich etwas von der vorherigen. Wenn die Funktion in der sechsten Zeile aufgerufen wird, wird ein Parameter übergeben. Der tatsächliche Parameter A der sechsten Zeilenfunktion ist 1 der globalen Variablen a = 1. Wenn die Funktion ausgeführt wird, ist die zweite Zeile A = 1, also die dritte Zeile -Alarm: 1 und die siebte Zeile -Warnung: 1.
Achten Sie auf den Unterschied zwischen diesen Beispielen und verwechseln Sie sie nicht.
Ein anderer:
var a = 1; Funktion en () {var a = 2; fn ();} Funktion fn () {alert (a); // 1} en ();A in FN wird nicht deklariert, und Sie müssen den Wert im Bereich, in dem die Funktion erstellt wird, annehmen - sie wird "erstellt", nicht den Umfang der Funktion "aufrufen".
PS: Umfangs- und Kontextkonzepte in JavaScript
Bereiche und Kontexte in JavaScript sind für diese Sprache einzigartig, was zum Teil der Flexibilität, die sie mit sich bringen, dank. Jede Funktion hat einen anderen variablen Kontext und einen anderen Bereich. Diese Konzepte werden durch einige leistungsstarke Designmuster in JavaScript unterstützt. Dies bringt jedoch auch große Verwirrung für Entwickler. Das Folgende zeigt vollständig die Unterschiede im Kontext und Umfang in JavaScript und wie verschiedene Entwurfsmuster sie verwenden.
Kontext gegen Umfang
Die erste Frage, die geklärt werden muss, ist, dass Kontext und Umfang unterschiedliche Konzepte sind. Im Laufe der Jahre habe ich bemerkt, dass viele Entwickler diese beiden Begriffe oft verwirren und fälschlicherweise als das andere beschreiben. Um fair zu sein, sind diese Begriffe sehr verwirrend geworden.
Jeder Funktionsaufruf hat einen Umfang und einen Kontext. Grundsätzlich ist der Umfang funktionsbasiert und Kontext ist objektbasiert. Mit anderen Worten, Geltungsbereich hängt jedes Mal auf Variablen zu, wenn die Funktion aufgerufen wird, und jeder Aufruf ist unabhängig. Der Kontext ist immer der Wert des Schlüsselworts, ein Verweis auf das Objekt, das den aktuellen ausführbaren Code aufruft.
Das obige ist der vom Herausgeber vorgestellte JavaScript -Umfang (empfohlen). Ich hoffe, es wird Ihnen hilfreich sein. Wenn Sie Fragen haben, hinterlassen Sie mir bitte eine Nachricht und der Editor wird Ihnen rechtzeitig antworten. Vielen Dank für Ihre Unterstützung auf der Wulin.com -Website!