Heim > Web-Frontend > js-Tutorial > Detaillierte Einführung in den Abschluss (Closure) in JavaScript_Javascript-Kenntnissen

Detaillierte Einführung in den Abschluss (Closure) in JavaScript_Javascript-Kenntnissen

WBOY
Freigeben: 2016-05-16 16:23:32
Original
909 Leute haben es durchsucht

Der Abschluss ist eine wichtige Funktion in JavaScript. Seine wichtigste Aufgabe besteht darin, Informationen während der Ausführung der Funktion zu speichern. In JavaScript stammen viele Funktionen von Abschlüssen während Funktionsaufrufen aus der Bereichskette.

Bereichskette von Funktionsaufrufobjekten und Variablen

Für jeden Funktionsaufruf in JavaScript erstellt JavaScript ein lokales Objekt, um die in der Funktion definierten lokalen Variablen zu speichern. Wenn innerhalb der Funktion eine verschachtelte Funktion definiert ist, definiert JavaScript ein verschachteltes lokales Objekt über einem bereits vorhandenen definiertes lokales Objekt. Für eine Funktion gibt es so viele Ebenen verschachtelter lokaler Objekte wie Ebenen verschachtelter Funktionsdefinitionen darin. Dieses lokale Objekt wird als „Funktionsaufrufobjekt“ bezeichnet („Aufrufobjekt“ in ECMAScript 3, umbenannt in „deklarativer Umgebungsdatensatz“ in ECMAScript 5, aber ich persönlich denke, dass der Name in ECMAScript 3 einfacher zu verstehen ist). Nehmen Sie als Beispiel den folgenden Funktionsaufruf:


Code kopieren Der Code lautet wie folgt:

Funktion f(x){
var a = 10;
return a*x;
}
console.log(f(6));//60

In diesem einfachen Beispiel erstellt JavaScript beim Aufruf der f()-Funktion ein Aufrufobjekt (nennen wir es f_invokeObj). Es gibt zwei Attribute im f_invokeObj-Objekt: a und x; Wenn Sie f() ausführen, ist der Wert von a 10 und der Wert von x 6, sodass das endgültige Rückgabeergebnis 60 ist. Das Symbol sieht wie folgt aus:

Wenn eine Funktionsverschachtelung vorhanden ist, erstellt JavaScript mehrere Funktionsaufrufobjekte:


Code kopieren Der Code lautet wie folgt:

Funktion f(x){
var a = 10;
Gib a*g(x);
zurück Funktion g(b){
Rückgabe b*b;
}
}
console.log(f(6));//360


In diesem Beispiel erstellt JavaScript beim Aufruf der Funktion f() ein Aufrufobjekt (f_invokeObj) der Funktion f(), das über zwei interne Attribute a und x verfügt. Der Wert von a ist 10 und der Wert von x 6; Führen Sie f() aus. JavaScript analysiert und definiert die Funktion g() in der Funktion f() und erstellt das aufrufende Objekt (g_invokeObj) von g(), das ein internes Attribut b hat und dessen b-Wert ist Dasselbe wie der eingehende Parameter x, der 6 ist, sodass das endgültige Rückgabeergebnis 360 ist. Das Symbol sieht wie folgt aus:

Wie Sie sehen können, bilden die Funktionsaufrufobjekte eine Kette. Wenn die eingebettete Funktion g() ausgeführt wird und den Variablenwert abrufen muss, beginnt die Suche beim nächstgelegenen Funktionsaufrufobjekt. Wenn es nicht durchsucht werden kann, wird in weiteren Aufrufobjekten entlang der Funktionsaufrufobjektkette gesucht die sogenannte „Variable Scope Chain“. Wenn dieselbe Variable in zwei Funktionsaufrufobjekten vorkommt, übernimmt die Funktion den Variablenwert im Aufrufobjekt, das ihr am nächsten liegt:


Code kopieren Der Code lautet wie folgt:

Funktion f(x){
var a = 10;
Gib a*g(x);
zurück Funktion g(b){
var a = 1;
Geben Sie b*b*a;
zurück }
}
console.log(f(6));//360, nicht 3600


Im obigen Beispiel ist die Variable a sowohl im aufrufenden Objekt der Funktion g() (g_invokeObj) als auch im aufrufenden Objekt der Funktion f() (f_invokeObj) vorhanden und der Wert von a ist unterschiedlich, wenn die Funktion g() ist run, in g() Der Wert von a, der innerhalb der Funktion verwendet wird, ist 1, während der Wert von a, der außerhalb der Funktion g() verwendet wird, 10 ist. Die in der Abbildung dargestellte Objektkette für Funktionsaufrufe lautet wie folgt:

Was ist eine Schließung?

Alle Funktionen (Funktionen) in JavaScript sind Objekte, und wenn eine Funktion definiert wird, wird eine entsprechende Funktionsaufruf-Objektkette generiert. Eine Funktionsdefinition entspricht einer Funktionsaufruf-Objektkette. Solange das Funktionsobjekt vorhanden ist, wird das entsprechende Funktionsaufrufobjekt nicht mehr verwendet Kette, nennen Sie es einfach „Abschluss“. Im obigen Beispiel der f()-Funktion und der g()-Funktion gibt es zwei Abschlüsse: Das f()-Funktionsobjekt und das f_invokeObj-Objekt bilden einen Abschluss, und das g()-Funktionsobjekt und die g_invokeObj-f_invokeObj-Objektkette bilden zusammen den zweiten Verschluss. Wenn die Ausführung der Funktion g() beendet ist, wird der Abschluss von g() als Garbage Collection erfasst, da die Funktion g() später nicht mehr verwendet wird. Wenn die Ausführung der Funktion f() abgeschlossen ist, wird f() aus demselben Grund geschlossen Das Paket wurde ebenfalls im Müll gesammelt.

Aus der Definition des Abschlusses können wir schließen, dass alle JavaScript-Funktionen nach der Definition Abschlüsse sind – da alle Funktionen Objekte sind, haben alle Funktionen nach der Ausführung auch ihre entsprechende aufrufende Objektkette.

Verschlüsse kommen jedoch vor allem bei verschachtelten Funktionen zur Geltung. Da die Inline-Funktion definiert wird, wenn die externe Funktion ausgeführt wird, sind die beim Abschluss der Inline-Funktion gespeicherten Variablenwerte (insbesondere die lokalen Variablenwerte der externen Funktion) die Werte während dieser Ausführung. Solange das eingebettete Funktionsobjekt noch vorhanden ist, bleibt sein Abschluss bestehen (die Variablenwerte im Abschluss ändern sich nicht), wodurch der Zweck erreicht wird, Informationen über den laufenden Prozess der Funktion zu speichern. Betrachten Sie dieses Beispiel:


Code kopieren Der Code lautet wie folgt:

var a = "außen";
Funktion f(){
var a = "inside";
Funktion g(){return a;}
Geben Sie g;
zurück }
var result = f();
console.log(result());//inside


In diesem Beispiel wird beim Ausführen der f()-Funktion die g()-Funktion definiert und ein Abschluss der g()-Funktion erstellt. Der g()-Abschluss enthält die Objektkette g_invokeObj-f_invokeObj, wodurch f() gespeichert wird. Der Wert der Variablen a während der Funktionsausführung. Wenn die Anweisung console.log() ausgeführt wird, ist der g()-Abschluss noch vorhanden, da das g-Funktionsobjekt noch vorhanden ist. Wenn das g-Funktionsobjekt ausgeführt wird, das noch vorhanden ist, verwendet JavaScript den noch vorhandenen g()-Abschluss und Get daraus den Wert der Variablen a („inside“).

Verwandte Etiketten:
Quelle:php.cn
Erklärung dieser Website
Der Inhalt dieses Artikels wird freiwillig von Internetnutzern beigesteuert und das Urheberrecht liegt beim ursprünglichen Autor. Diese Website übernimmt keine entsprechende rechtliche Verantwortung. Wenn Sie Inhalte finden, bei denen der Verdacht eines Plagiats oder einer Rechtsverletzung besteht, wenden Sie sich bitte an admin@php.cn
Beliebte Tutorials
Mehr>
Neueste Downloads
Mehr>
Web-Effekte
Quellcode der Website
Website-Materialien
Frontend-Vorlage