Die Ausführungsumgebung definiert andere Daten, die Variablen oder Funktionen zugreifen können, und bestimmt ihr jeweiliges Verhalten. Jede Ausführungsumgebung ist mit einem variablen Objekt zugeordnet.
Die globale Ausführungsumgebung ist die periphere Ausführungsumgebung. Abhängig von der Hostumgebung, in der sich die JavaScript -Implementierung befindet, sind auch die Objekte, die die Ausführungsumgebung darstellen, unterschiedlich. In einem Webbrowser wird die globale Ausführungsumgebung als Fensterobjekt angesehen. Daher werden alle globalen Variablen und Funktionen als Eigenschaften und Methoden von Fensterobjekten erstellt.
Variables Objekt: Alle in der Umgebung definierten Variablen und Funktionen werden in diesem Objekt gespeichert.
SCOPE -Kette: Wenn der Code in einer Umgebung ausgeführt wird, wird eine Bereichskette von variablen Objekten erstellt. Der Zweck der Bereichskette ist es, den geordneten Zugriff auf alle Variablen und Funktionen zu gewährleisten, die die Erlaubnis zum Zugriff auf die Ausführungsumgebung haben. Das vordere Ende der Bereichskette ist immer ein variables Objekt in der Umgebung, in der sich der derzeit ausgeführte Code befindet.
Aktives Objekt: Das aktive Objekt enthält nur eine Variable am Anfang, dh das Argumenteobjekt. Das nächste variable Objekt in der Bereichskette stammt aus der Umgebung mit Inklusion (externe), und das nächste variable Objekt stammt aus der nächsten Einschlussumgebung. Dies setzt sich für die globale Ausführungsumgebung fort; Die variablen Objekte der globalen Ausführungsumgebung sind immer das letzte Objekt in der Bereichskette.
Identifikator Parsing: Die Analyse von Identifikatoren ist ein Prozess der Suche nach Identifikatoren nacheinander entlang der Bereichskette. Der Suchprozess beginnt immer am vorderen Ende der Bereichskette und geht dann Schritt für Schritt zurück, bis die Kennung gefunden wird.
Beispielcode:
var color = "blau"; Funktion echnamecolor () {if (color === "blau") {color = "rot"; } else {color = "blau"; }} echnecolor (); alert ("Farbe ist jetzt" + Farbe);Die Umfangskette der Funktion echnamecolor () enthält zwei Objekte: ein eigenes variables Objekt (das Argumenteobjekt definiert) und ein variables Objekt globaler Variablen. Die variable Farbe kann in der Funktion zugegriffen werden, da sie in dieser Bereichskette gefunden werden kann.
Darüber hinaus können Variablen, die in lokalen Scopes definiert sind, mit globalen Variablen in einer lokalen Umgebung austauschbar verwendet werden: Beispiel:
var color = "blau"; Funktion echnamecolor () {var AnotherColor = "rot"; function swapcolors () {var tempcolor = AnotherColor; AnotherColor = Farbe; color = tempcolor; // Sie können hier auf Farbe zugreifen, ein anderes Color und Tempcolor} // Sie können hier auf Farbe zugreifen, aber Sie können nicht auf Tempcolor Swapcolors () zugreifen;} // Sie können nur auf ColorchangeColor () zugreifen;Der obige Code umfasst 3 Ausführungsumgebungen: die globale Umgebung, die Handlungsumgebung von ChangeColor () und die lokale Umgebung von Swapcolors ().
In der globalen Variablen gibt es eine variable Farbe und eine Funktion echnamecolor (). Die lokale Variable von echnecolor () enthält eine Variable ONDEREColor und eine Funktion SWAPCOLORS (), die in der globalen Variablen auf die Farbe zugreifen kann. In der lokalen Variablen von swapcolors () gibt es ein variables Tempcolor. In Swapcolors () können Sie auf die Farbe in der globalen Variablen oder in der anderen Color -Variablen zugreifen, da diese beiden Umgebungen die Umgebung mit übergeordneten Ausführungen sind. Die Bereichskette des obigen Beispiels lautet:
Unter ihnen kann die interne Umgebung über die Bereichskette auf alle externen Umgebungen zugreifen, aber die externe Umgebung kann in der internen Umgebung nicht auf Variablen und Funktionen zugreifen . Die Verbindungen zwischen Umgebungsvariablen sind linear und sequentiell. Jede Variable kann nur nach der Zielfernrohrkette von der Überlegenen zum Abfragen der Variablen und des Funktionsnamens suchen, dh zuerst die Variable oder den Funktionsnamen in dieser Funktion abfragen und wenn sie erst im oberen Bereich an der vorherigen Bereichskette abfragt wird. Keine Umgebung kann jedoch die Umfangskette durchsuchen und eine andere Ausführungsumgebung eingeben.
Funktionsparameter werden auch als Variablen behandelt, sodass ihre Zugriffsregeln mit anderen Variablen in der Ausführungsumgebung übereinstimmen.
1. Erweitern Sie die Bereichskette
Die Bereichskette wird erweitert, wenn der Ausführungsfluss eine der folgenden Aussagen eingibt:
• Fangen Sie Block der Anweisung Try-Catch-Anweisung an
• Mit Anweisung
Diese beiden Aussagen fügen dem vorderen Ende des Bereichs ein variables Objekt hinzu.
Für die With -Anweisung wird die angegebene Variable in die Bereichskette hinzugefügt. Für die Catch -Anweisung wird ein neues variables Objekt erstellt, das die Erklärung des falschen Objekts enthält, das geworfen wird.
Zum Beispiel:
Funktion Buildurl () {var qs = "? Debug = true"; mit (Ort) {var url = href + qs; } return url;}Die With -Anweisung empfängt ein Standortobjekt, sodass sein variables Objekt die Eigenschaften und Methoden enthält, die vom Standortobjekt verwendet werden, und dieses variable Objekt wird dem vorderen Ende der Bereichskette hinzugefügt. Wenn Sie sich auf die Variable HREF in der With -Anweisung beziehen (tatsächlich bezieht sich auf Ort.reif), finden Sie sie in der aktuellen Umgebungsvariablen. Bei Bezug auf die Variable QS wird die in buildurl () definierte Variable referenziert, auf die sich im Funktionsumgebungsvariablenobjekt befindet. Was die With -Anweisung betrifft, so wird eine Variable namens URL definiert, sodass die URL Teil der Funktionsausführungsumgebung wird und als Wert der Funktion zurückgegeben werden kann.
2. Kein Umfang auf Blockebene
In JavaScript haben geschlossene lockige Zahnspangen keinen eigenen Umfang. Schauen Sie sich den folgenden Code an:
if (true) {var color = "blau";} alert (color); // "Blau"In JavaScript fügt die durch die IF/for Anweisung erstellte Variablenerklärung die Variable der aktuellen Ausführungsumgebung hinzu. Zum Beispiel:
für (var i = 0; i <10; i ++) {dosomething (i);} alert (i); // 10Müllrecycling
Ähnlich wie bei Java verfügt JavaScript auch über einen automatischen Müllrecyclingmechanismus. Die Ausführungsumgebung ist für die Verwaltung des während der Codeausführung verwendeten Speichers verantwortlich. Beim Schreiben von Programmen sind keine Probleme mit der verwandten Speicherverwendung erforderlich. Die Zuweisung des erforderlichen Speichers und das Recycling des nutzlosen Speichers sind vollständig implementiert. Das Prinzip des Müllsammungsmechanismus lautet: Finden Sie Variablen heraus, die nicht mehr verwendet werden, und befreien Sie dann das Gedächtnis, das sie besetzt. Dazu führt der Müllsammler diesen Vorgang regelmäßig in einem festen Zeitintervall (oder einer vorgegebenen Sammelzeit während der Codeausführung) durch.
Bevor Sie die Müllsammlung durchführen, müssen Sie feststellen, ob die Ressource nutzlos ist, und markieren Sie Variablen, die nicht mehr verwendet werden, um ihr Gedächtnis in Zukunft zu recyceln. In der Regel gibt es zwei Implementierungen von Strategien zur Identifizierung nutzloser Variablen.
1 Mark klar
Der häufigste Weg zur Müllsammlung in JavaScript ist die Markerreinigung. Wenn eine Variable in die Umgebung eintritt, wird sie als "Eintritt in die Umgebung" gekennzeichnet. Wenn eine Variable die Umgebung verlässt, wird sie als "Ausgang der Umgebung" gekennzeichnet. Wenn der Müllsammler läuft, markiert er alle verwendeten Variablen. Anschließend werden die Tags von Variablen in der Umgebung und Variablen entfernt, auf die Variablen in der Umgebung bezeichnet werden. Danach werden die markierten Variablen als Variablen angesehen, die bereit sind, gelöscht zu werden. Schließlich vervollständigt der Müllkollektor die Memory Clearing -Arbeit, zerstört die markierten Werte und recycelt den Speicherplatz, den sie besetzen.
2. Referenzzahl
Die Referenzzahl bezieht sich auf die Anzahl, mit der auf jeden Wert verwiesen wird. Wenn eine Variable deklariert und der Variablen ein Referenztypwert zugewiesen wird, beträgt die Anzahl der Verweise auf diesen Wert 1. Wenn der gleiche Wert einer anderen Variablen zugewiesen wird, wird die Anzahl der Verweise auf den Wert um 1. Umgekehrt erhöht, wenn die Variable, die die Verweise auf diesen Wert enthält, auf eine andere Variable enthält. Speicherplatz kann zurückgefordert werden. Wenn der Garbage Collector das nächste Mal ausgeführt wird, recycelt er den Speicher, der durch diese Werte ohne Referenzen besetzt ist.
Ein Problem, das Referenzzählung zu recycelten Referenzen verursachen kann. Zum Beispiel:
Funktion problem () {var obja = new Object (); var objb = neues Objekt (); obja.someotherobj = objb; objb.someotherobj = obja;}Im obigen Beispiel beziehen sich Obja und OBJB durch Attribute aufeinander. Nach Abschluss der Funktionsausführung werden Obja und OBJB weiterhin existieren und ihre Referenzzahl wird nicht 0 sein. Diese Situation wird dazu führen, dass das von Obja und OBJB besetzte Gedächtnis recycelt werden.
In dem obigen Artikel handelt es sich kurz um JavaScript: Ausführungsumgebung, Umfang und Müllsammlung sind alle Inhalte, die ich mit Ihnen teile. Ich hoffe, Sie können Ihnen eine Referenz geben und ich hoffe, Sie können wulin.com mehr unterstützen.