JavaScript umfasst Konzepte wie Umfang (Umfang), Scope -Kette (Scope -Kette), Kontext (Ausführungskontext), aktives Objekt (aktives Objekt), dynamischer Umfang (dynamischer Umfang) und Verschluss (Verschluss). Um diese Konzepte zu verstehen, analysieren wir sie sowohl aus statischen als auch aus dynamischen Aspekten.
Schreiben wir zunächst eine einfache Funktion, um ein Beispiel zu erstellen:
Die Codekopie lautet wie folgt:
Funktion add (num1, num2) {
var sum = num1 + num2;
Rückgabesumme;
}
Wir definieren eine Add -Funktion mit zwei formalen Parametern.
Statische Aspekte:
Beim Erstellen einer Add -Funktion erzeugt die JavaScript -Engine eine Bereichskette der Add -Funktion, und diese Bereichskette zeigt auf den globalen Kontext. Wenn Sie grafische Darstellungen verwenden, ist die folgende Abbildung dargestellt:
Wie aus der obigen Abbildung hervorgeht, wurde die Bereichskette erzeugt, wenn die Funktion der Add -Funktion erzeugt wird, sodass wir eine Schlussfolgerung ziehen können, dass die Bereichskette der Funktion erzeugt wird, wenn die Funktion erstellt wird, und nicht eine dynamische Laufzeit. Schauen wir uns an, was während des dynamischen Laufs passiert.
Dynamische Aspekte:
Bei der Ausführung der Funktion hinzufügen erstellt JavaScript einen Ausführungskontext, der alle Informationen enthält, die während der Laufzeit der Funktion hinzufügen. Execute -Kontext hat auch eine eigene Zielfernrohrkette. Wenn die Funktion ausgeführt wird, initialisiert die JavaScript -Engine zunächst die Bereichskette des Ausführungskontexts aus der Bereichskette der Funktion hinzufügen, und dann erstellt die JavaScript -Engine ein aktives Objekt, das alle lokalen Variablen, Parameter und diese und andere Variablen während der Funktionszeit enthält.
Wenn das Bild beschrieben wird, was während der dynamischen Laufzeit der Funktion hinzufügen, kann es in der folgenden Abbildung beschrieben werden:
Wie aus der obigen Abbildung ersichtlich ist, ist der Ausführungskontext ein dynamisches Konzept. Es wird erstellt, wenn die Funktion ausgeführt wird. Gleichzeitig ist das aktive Objektobjekt auch ein dynamisches Konzept. Es wird durch die Bereichskette des Ausführungskontexts verwiesen. Daher kann der Schluss gezogen werden, dass sowohl der Ausführungskontext als auch das aktive Objekt dynamische Konzepte sind und die Umfangskette des Ausführungskontexts durch die Funktionsbereichskette initialisiert wird.
Die obigen Gespräche über den Umfang des Funktionsumfangs und des Ausführungskontexts. Lassen Sie uns über das Problem des dynamischen Umfangs sprechen. Wenn JavaScript mit Aussagen, Versuchscatch-Klauseln und Bewertungsmethoden vergeht, ändert die JavaScript-Engine den Umfang des Ausführungskontexts dynamisch. Schauen wir es uns mit einem Beispiel an:
Die Codekopie lautet wie folgt:
Funktion initui () {
Mit (Dokument) {// vermeiden!
var bd = Körper,
links = getElementsByTagName ("a"),
i = 0,
len = links.length;
während (i <len) {
Update (Links [i ++]);
}
getElementById ("go-btn"). onclick = function () {
Start();
};
bd.className = "active";
}
Bei der Ausführung der oben genannten Initui -Funktion erstellt JavaScript dynamisch einen entsprechenden Bereich, der der With -Anweisung entspricht, und platziert es am vorderen Ende der Ausführungskontextkette. Der obige Vorgang kann durch die folgende Abbildung lebhaft beschrieben werden. Der rot markierte Bereich unten zeigt den von der With -Anweisung erzeugten Umfang.
Schauen wir uns schließlich die mysteriösesten Schließung in JavaScript an. Schließungen sind tatsächlich eine Funktion in JavaScript. Die Schließung wird während der Funktionslaufzeit erstellt. Nehmen wir ein Beispiel, um zu sehen:
Die Codekopie lautet wie folgt:
Funktion ordnungsgemäßeVents () {
var id = "xdi9592";
document.getElementById ("speichern-btn"). onclick = function (Ereignis) {
SaveDocument (ID);
};
}
Wenn die oben genannte Funktion "AstromingEvents" ausgeführt wird, wird eine Schließung erstellt, und diese Schließung bezieht sich auf die ID -Variable im Bereich von Astromenten. Wenn nach der traditionellen Programmiersprache ID eine Variable ist, die auf dem Stapel gespeichert ist. Wenn die Funktion ausgeführt wird, verschwindet die ID. Wie kann sie also erneut verwiesen werden? Offensichtlich nimmt JavaScript hier einen weiteren Weg an. Schauen wir uns an, wie JavaScript Schließungen implementiert. Bei der Ausführung der Funktion "Astromentenevents" erstellt die JavaScript -Engine eine Bereichskette des Ausführungskontexts der Funktion "Astromentenevents". Diese Scope -Kette enthält die aktiven Objekte, wenn die Astromplätze ausgeführt werden. Gleichzeitig erzeugt die JavaScript -Engine auch einen Verschluss, und die Umfangskette des Verschlusses bezieht sich auch auf die aktiven Objekte, wenn die AstromingEvents ausgeführt werden. Auf diese Weise bezieht sich der Abschluss, wenn die Astromenten -Events ausgeführt werden, obwohl sich die Umfangskette ihres eigenen Ausführungskontexts nicht mehr auf die aktiven Objekte bezieht, der Verschluss immer noch auf die aktiven Objekte, die der Laufzeit von Astromplätzen entsprechen, was den Schließmechanismus innerhalb von JavaScript erklärt. Sie können die folgende Abbildung verwenden, um die Situation der oben genannten Abtretungs -Funktions -Laufzeit zu beschreiben:
Wie aus den oben genannten Erscheinen hervorgeht, document.getElementById ("Save-Btn"). Onclick bezieht sich auf die Schließung. Auf diese Weise wird die Ausführung des Verschlusses ausgelöst, wenn der Benutzer auf Save-BTN klickt. Schauen wir uns die Situation an, wenn die Schließung ausgeführt wird. Wie bereits erwähnt, sind Schließungen in JavaScript tatsächlich Funktionen, sodass die Situationen der Ausführung und Funktionsausführung von Schließungen konsistent sind. Die folgende Abbildung beschreibt lebhaft den mit dem obigen Onclick -Ereignis verbundenen Verschluss.
Aus der obigen Abbildung können wir erkennen, dass die JavaScript -Engine zuerst den Ausführungskontext des Verschlusses erstellt, dann die Kette des Verschlusss der Verschluss verwendet, um die Kette des Ausführungskontexts des Verschlusses zu initialisieren, und schließlich den entsprechenden aktiven Objekt setzt, wenn der Verschluss am vorderen Ende des Geltungsbereichs, was weiter verwertet, dass der Verschluss eine Funktion ist.