In jeder Programmiersprache haben seine Variablen einen bestimmten gültigen Bereich. Nachdem die Variablen diesen Bereich überschritten haben, werden sie ungültig. Dies ist der Umfang der Variablen. Aus mathematischer Sicht ist es der Bereich unabhängiger Variablen.
Geltungsbereich ist der zugängliche Bereich von Variablen, dh den Umfang kontrolliert die Sichtbarkeit und den Lebenszyklus von Variablen und Funktionen. In JavaScript sind Objekte und Funktionen auch Variablen, und Variablen werden innerhalb der willkürlichen Funktionsbehörde definiert, die durch die Deklaration ihrer Funktionskörper und die willkürliche Funktionsbehörde verschachtelt sind.
1. statischer Bereich und dynamischer Umfang
Statischer Umfang
Dies bedeutet, dass der Umfang der Deklaration zur Kompilierungszeit auf der Grundlage der Programmbehörde ermittelt wird, die auch als lexikalischer Bereich bezeichnet wird. Die meisten modernen Programmiersprachen übernehmen statische Umfangsregeln, und JavaScript übernimmt diesen Umfang.
In Sprachen, die statische Bereiche verwenden, sind die innersten verschachtelten Rahmenregeln im Grunde genommen: Die durch eine Erklärung eingeführte Kennung ist in dem Bereich sichtbar, in dem sich die Erklärung befindet, und auch in jedem im Inneren verschachtelten Bereich, es sei denn, sie ist durch eine andere gleichnamige Erleichterung abgedeckt, die im Inneren verschachtelt ist.
Um das von einer bestimmten Kennung verwiesene Objekt zu finden, sollte es im aktuellen innersten Bereich gefunden werden. Wenn eine Erklärung gefunden wird, finden Sie das von der Kennung verwiesene Objekt. Andernfalls werden wir im direkten äußeren Bereich suchen und den äußeren Bereich weiter nach außen überprüfen, bis wir die äußerste Niststufe des Programms erreichen, dh den Umfang, in dem sich die globale Objekterklärung befindet. Wenn auf allen Ebenen keine Erklärung gefunden wird, hat das Programm einen Fehler. wie folgt:
Funktion cha () {var name = "xiao;" Funktion chb () {Funktion chc () {console.log (name); }}}Zuerst sucht die Funktion nach der Definition des Namens von CHB () und sucht dann weiterhin Schicht für Schicht. Schließlich findet sich die Definition des Namens in CHA (). Wenn es nicht gefunden wird, wird ein Fehler gemeldet.
2. Dynamischer Umfang
In einer dynamisch geschichteten Sprache wird das von einer Variablen im Programm verwiesene Objekt anhand der Steuerflussinformationen des Programms zum Zeitpunkt des Auslaufs des Programms ermittelt.
2. Der Umfang von JavaScript
JavaScript gibt es zwei Bereiche, nämlich den globalen Bereich und den lokalen Bereich.
1. Globaler Bereich
Es gibt eine Definition überall im Code. Auch wenn eine globale Variable in einem auf der HTML -Seite verschachtelten JS -Code definiert ist, kann die Variable in der referenzierten JS -Datei dennoch zugegriffen werden. Dies führt sehr wahrscheinlich, dass globale Variablen Verschmutzung verursachen.
Die Variablen in den folgenden drei Fällen werden als globale Variablen angesehen
(1) Die äußerste Funktion und die äußerste Variable haben einen globalen Bereich
(2) Variablen, die direkt ohne Definition zugewiesen werden
(3) Die Eigenschaften aller Fensterobjekte haben einen globalen Umfang
2. Lokaler Bereich
Lokale Bereiche können im Allgemeinen nur in festen Code -Snippets zugegriffen werden, z. B. Variablen in Funktionen (Funktionsumfang)
var name = "xuxiaoping"; function echoname () {var firstname = "xu"; // Lokaler Bereich SecondName = "xiao"; // Globale Bereiche Funktion eChofirstname () {console.log (Vorname); // xu} console.log (Secondname); return echofirstname;} console.log (name); // global scope var f = echoname (); f (); console.log (firstName); console.log (SecondName);Das Ergebnis ist:
Xuxiaoping
Xiao
xu // Die innere Funktion kann auf Variablen der äußeren Funktion zugreifen
Unerlappt // Die internen Variablen der Funktion können nicht außerhalb der Funktion zugegriffen werden
Xiao
JavaScript hängt globale Variablen an Fensterobjekte an und wird zu einer Eigenschaft von Fensterobjekten.
3. Funktionsumfang
Umfang auf Blockebene: Alle Aussagen von Aussagen in Klammern gehören zu einem Block, und alle darin definierten Variablen sind außerhalb des Codeblocks unsichtbar. Die meisten Sprachen der C-Klasse haben Blockebene.
Ein wichtiges Merkmal von JavaScript ist jedoch, dass es keinen Umfang auf Blockebene hat.
Funktion echoi () {für (var i = 0; i <10; i ++) {; // console.log (i); } if (true) {var str = "Hallo"; } console.log (i); console.log (str);} echoi ();Das Ausgangsergebnis ist:
10
Hallo
Es ist zu erkennen, dass außerhalb der für die für die Anweisung (oder wenn), die Variable, die ich im Block definiert habe, immer noch zugänglich ist. Das heißt, JavaScript unterstützt keine Bereiche auf Blockebene, sondern unterstützt nur Funktionsbereiche und Variablen, die in einer Funktion überall in dieser Funktion definiert sind. Als jemand, der von Anfang an C und Java lernt, ist dies ein bisschen schwierig, sich anzupassen. Nach meinen Tests gilt dies auch für PHP.
Natürlich können Sie die Verschlusseigenschaften von JavaScript verwenden, um den Umfang auf Blockebene zu simulieren
Funktion echoi () {(function () {for (var i = 0; i <10; i ++) {; // console.log (i);}}) (); if (true) {var str = "Hallo"; } console.log (i); console.log (str);} echoi ();Das Ergebnis ist: Ich definierte
Dies isoliert die Definition von Variablen. In JS sollten um die Benennung von Konflikten zu verhindern, globale Variablen und globale Funktionen so weit wie möglich vermieden werden, sodass diese Art von Schließung in vielerlei Hinsicht verwendet wird.
4.. JavaScript variabler Lebenszyklus
Der javaScript -variable Lebenszyklus wird bei der Deklaration initialisiert.
Lokale Variablen werden nach Ausführung der Funktion zerstört.
Globale Variablen werden zerstört, nachdem die Seite geschlossen wurde.
3. JavaScript -Bereichskette
Es sieht aus wie eine Kette, es kann wahrscheinlich mit der verknüpften Liste in der Datenstruktur kombiniert werden.
In JavaScript sind Funktionen Objekte, aber tatsächlich sind alles in JavaScript Objekte. Funktionsobjekte haben wie andere Objekte Eigenschaften, auf die über Code und eine Reihe interner Eigenschaften zugegriffen werden können, auf die nur für die JavaScript -Engine zugänglich sind. Eine der internen Eigenschaften ist [[Scope]], definiert durch die dritte Ausgabe des ECMA-262-Standards. Diese internen Eigenschaften enthalten eine Sammlung von Objekten in dem von der Funktion erstellten Bereich. Diese Sammlung wird als Scope -Kette der Funktionen bezeichnet, die feststellt, auf welche Daten durch Funktionen zugegriffen werden können.
Wenn eine Funktion erstellt wird, ist die Umfangskette mit Datenobjekten gefüllt, auf die im Bereich der Funktion zugänglich ist. Definieren Sie beispielsweise eine solche Funktion:
Funktion add (num1, num2) {var sum = num1 + num2; Rückgabesumme;}Wenn die Funktion hinzugefügt wird, wird ein globales Objekt in seiner Bereichskette gefüllt, die alle globalen Variablen enthält, wie in der Abbildung unten gezeigt (Hinweis: Das Bild gibt nur einige der Variablen an):
Der Funktionsumfang wird während der Ausführung verwendet. Führen Sie beispielsweise den folgenden Code aus:
var total = add (5,10);
Bei der Ausführung dieser Funktion wird ein internes Objekt namens "Ausführungskontext" erstellt. Der Laufzeitkontext definiert die Umgebung, in der die Funktion ausgeführt wird. Jeder Laufzeitkontext verfügt über eine eigene Zielfernrohrkette für die Analyse von Identifikatoren. Wenn der Laufzeitkontext erstellt wird, wird seine Bereichskette als Objekt initialisiert, das in [[Scope]] der aktuellen Lauffunktion enthalten ist.
Diese Werte werden in der Reihenfolge, in der sie in der Funktion erscheinen, in die Bereichskette des Laufzeitkontexts kopiert. Zusammen bilden sie ein neues Objekt namens "Aktivierungsobjekt", das alle lokalen Variablen, als Parameter, Parametersätze und diese Funktion enthält. Dann wird dieses Objekt in das vordere Ende der Bereichskette geschoben. Wenn der laufende Kontext zerstört wird, wird das aktive Objekt zerstört. Die neue Bereichskette ist in der folgenden Abbildung dargestellt:
Während der Funktionsausführung wird jedes Mal, wenn eine Variable auftritt, ein Identifikator -Parsenprozess übergeben, um zu entscheiden, wo Daten erhalten und gespeichert werden sollen. Dieser Vorgang beginnt vom Kopf der Bereichskette, dh nach einem gleichnamigen Bezeichner des aktiven Objekts. Wenn es gefunden wird, verwenden Sie die Variable, die dieser Kennung entspricht. Wenn es nicht gefunden wird, suchen Sie weiter nach dem nächsten Objekt in der Bereichskette. Wenn nach der Suche nicht alle Objekte gefunden werden, wird die Kennung als undefiniert angesehen. Während der Ausführung der Funktion muss jeder Kennung einen solchen Suchprozess durchlaufen.
4. Umfangskette und Codeoptimierung
Aus der Struktur der Bereichskette ist ersichtlich, dass in der Bereichskette des Laufzeitkontextes die Kennung tiefer ist, desto langsamer wird die Lese- und Schreibgeschwindigkeit. Wie in der obigen Abbildung gezeigt, ist es am Ende der Kontext -Scope -Kette während der Laufzeit immer globale Variablen, bei der Analyse der Kennung am langsamsten, globale Variablen zu finden. Beim Schreiben von Code sollten Sie daher versuchen, so wenig wie möglich globale Variablen zu verwenden und lokale Variablen so weit wie möglich zu verwenden. Eine gute Faustregel lautet: Wenn ein Kreuz-Scope-Objekt mehr als einmal verwiesen wird, speichern Sie es vor der Verwendung in einer lokalen Variablen. Zum Beispiel der folgende Code:
function echnecolor () {document.getElementById ("btnchange"). onclick = function () {document.getElementById ("targetCanvas"). style.backgroundcolor = "Red"; };}Diese Funktion bezieht sich zweimal auf das globale Variable -Dokument. Die Variable muss durch die gesamte Zielfernrohrkette durchsucht werden, bis sie schließlich im globalen Objekt gefunden wird. Dieser Code kann wie folgt umgeschrieben werden:
function echnecolor () {var doc = document; doc.getElementById ("btnchange"). onclick = function () {doc.getElementById ("targetCanvas"). style.backgroundcolor = "rot"; };}Dieser Code ist relativ einfach und zeigt nach dem Umschreiben keine enorme Leistungsverbesserung. Wenn jedoch eine große Anzahl globaler Variablen im Programm wiederholt zugegriffen wird, wird die Leistung des Codes nach dem Umschreiben erheblich verbessert.
5. mit Änderungsumfangskette
Der entsprechende Laufzeitkontext ist jedes Mal eindeutig, wenn die Nummer ausgeführt wird. Wenn Sie also mehrmals die gleiche Funktion aufrufen, führt dies zur Erstellung mehrerer Laufzeitkontexte. Wenn die Funktion ausgeführt wird, wird der Ausführungskontext zerstört. Jeder Laufzeitkontext ist mit einer Bereichskette verbunden. Im Allgemeinen wird seine Bereichskette während des laufenden Kontextes nur von der With -Erklärung und der Catch -Erklärung beeinflusst.
Die With -Anweisung ist eine schnelle Möglichkeit, Objekte anzuwenden, um das Schreiben von doppelten Code zu vermeiden. Zum Beispiel:
Funktion initUi () {mit (Dokument) {var bd = body, links = getElementsByTagName ("a"), i = 0, len = links.length; while (i <len) {Update (Links [i ++]); } getElementById ("btninit"). onclick = function () {dosomething (); }; }}Verwenden Sie hier Breiteanweisungen, um das mehrmalige Schreiben des Dokuments zu vermeiden, das effizienter aussieht, aber tatsächlich Leistungsprobleme erzeugt.
Wenn der Code zur With -Anweisung läuft, wird die Umfangskette des Laufzeitkontexts vorübergehend geändert. Es wird ein neues veränderliches Objekt erstellt, das alle Eigenschaften des durch den Parameters angegebenen Objekts enthält. Dieses Objekt wird in den Kopf der Scope -Kette gedrückt, was bedeutet, dass alle lokalen Variablen der Funktion jetzt im zweiten Zielfernrohrkettenobjekt sind, sodass der Zugriff teurer ist. Wie in der Abbildung unten gezeigt:
Daher sollten mit Aussagen in Programmen vermieden werden. In diesem Beispiel kann das einfache Speichern des Dokuments in einer lokalen Variablen die Leistung verbessern.
Zusammenfassen
1. Der Umfang einer Variablen ist, wo der Umfang der Variablen gültig ist.
2. Die Variablenkette ist die Sammlung von Objekten im Bereich, die erstellt werden.
Das obige dreht sich alles um diesen Artikel. Ich hoffe, dass es für alle hilfreich sein wird, JavaScript -Programme zu lernen.