Verschluss ist eine Schwierigkeit in der JavaScript -Sprache und ihrer Funktion. Viele fortgeschrittene Anwendungen stützen sich auf Schließungen, um die Implementierung zu implementieren.
Schließungen haben drei Eigenschaften:
1. Funktion verschachtelte Funktionen
2. Die Funktion kann sich auf externe Parameter und Variablen im Inneren beziehen
3.. Parameter und Variablen werden nicht vom Müllsammlermechanismus erfasst
Schließungen beziehen sich auf Funktionen, die Zugriff auf Variablen im Bereich einer anderen Funktion haben. Der häufigste Weg, um Schließungen zu erstellen, besteht darin, eine andere Funktion innerhalb einer Funktion zu erstellen und über eine andere Funktion auf lokale Variablen dieser Funktion zuzugreifen.
Es gibt den Vorteil, Schließungen zu verwenden, und es ist auch ein Nachteil davon, dass es sich um lokale Variablen im Speicher befinden und die Verwendung globaler Variablen vermeiden kann. Globale Variablen sind in jedem Modul abrufbar, das katastrophal sein wird.
Daher wird empfohlen, private, eingekapselte lokale Variablen zu verwenden.
Nach der Ausführung der allgemeinen Funktion wird das lokale aktive Objekt zerstört und nur der globale Bereich wird im Speicher gespeichert. Aber die Schließsituation ist anders!
Schließungen für verschachtelte Funktionen:
Funktion aaa () {var a = 1; return function () {alert (a ++)}; } var fun = aaa (); fun (); // 1 nach Ausführung a ++, dann ist a noch in ~ fun (); // 2 fun = null; // a wird recycelt! !Das obige Ausgangsergebnis beträgt 5;
Verschlüsse halten die Variablen ständig im Speicher und erhöhen bei unsachgemäßer Verwendung den Speicherverbrauch.
Das Prinzip der Müllsammlung in JavaScript
(1) In JavaScript wird das Objekt von GC recycelt, wenn auf ein Objekt nicht mehr verwiesen wird.
(2) Wenn sich zwei Objekte aufeinander beziehen und von der dritten Person nicht mehr verwiesen werden, werden diese beiden Objekte auch aufeinander recycelt.
Was sind die Vorteile der Verwendung von Schließungen? Die Vorteile der Verwendung von Schließungen sind:
1. Ich hoffe, eine Variable ist lange im Speicher stationiert
2. Vermeiden Sie eine Kontamination globaler Variablen
3. Die Existenz privater Mitglieder
1. Akkumulation globaler Variablen
<Script> var a = 1; Funktion ABC () {a ++; alarm (a);} abc (); // 2abc (); // 3 </script>2. Lokale Variablen
<Script> Funktion ABC () {var a = 1; a ++; alarm (a);} abc (); // 2abc (); // 2 </script>Wie kann eine Variable A erreicht werden, dass sowohl eine lokale Variable als auch eine akkumulierte Variable sind?
3. Akkumulation lokaler Variablen (die Schließungen können möglich)
<Script> function outer () {var x = 10; return function () {// Funktion verschachtelte Funktion x ++; Alarm (x); }} var y = äußere (); // externe Funktion wird der Variablen y; y () zugeordnet; // y Funktion wird einmal aufgerufen, das Ergebnis ist 11Y (); // y -Funktion wird das zweite Mal bezeichnet, das Ergebnis ist 12 und realisiert die Akkumulation </script>Funktionserklärungen und Funktionsausdrücke in JS:
In JS können wir eine Funktion über die Keyword -Funktion deklarieren:
<Script> Funktion ABC () {alert (123);} abc (); </script>Wir können auch eine "()" verwenden, um diese Erklärung in einen Ausdruck zu verwandeln:
<Script> (function () {alert (123);}) (); // Rufen Sie dann den vorherigen Ausdruck direkt über () auf, sodass die Funktion keinen Namen schreiben muss. </Script>4. Modularer Code zur Verringerung der Verschmutzung globaler Variablen
<Script> var abc = (function () {// ABC ist der Rückgabewert der externen anonymen Funktion var a = 1; return function () {a ++; alert (a);}}) (); abc (); // 2; Wenn Sie die ABC -Funktion einmal aufrufen, wird der Rückgabewert der internen Funktion ABC () tatsächlich aufgerufen. // 3 </script>5. Die Existenz privater Mitglieder
<Script> var aaa = (function () {var a = 1; Funktion bbb () {a ++; alert (a);} Funktion ccc () {a ++; alert (a);} return {b: bbb, // json struktur c: ccc}}) (); aaa.b (); //2aaa.c () // 3 </script>6. Ermitteln Sie direkt den Index des entsprechenden Elements in der Schleife
<! DocType html public "-// w3c // dtd xhtml 1.0 transitional // en" "http://www.w3.org/tr/xhtml1/dtd/xhtml1-transsitional.dtd"> <html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en"> <head> <meta http-equiv="Content-Type" content="text/html;charset=UTF-8" /> <title></title> <script> window.onload = function(){ var aLi = document.getElementsByTagName ('li'); für (var i = 0; i <ali.length; i ++) {ali [i] .onclick = function () {// beim Klicken, die für die Schleife hat Alert (i) beendet; }; }} </script> </head> <body> <ul> <li> <li> 123 </li> <li> 456 </li> <li> 789 </li> <li> 010 </li> </ul> </body> </html>7. Verschluss verwenden, um den obigen Code umzuschreiben:
<! DocType html public "-// w3c // dtd xhtml 1.0 transitional // en" "http://www.w3.org/tr/xhtml1/dtd/xhtml1-transsitional.dtd"> <html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en"> <head> <meta http-equiv="Content-Type" content="text/html;charset=UTF-8" /> <title></title> <script> window.onload = function(){ var aLi = document.getElementsByTagName ('li'); für (var i = 0; i <ali.length; i ++) {(Funktion (i) {ali [i] .onclick = function () {alert (i);};}) (i); }}; </script> </head> <body> <ul> <li> 123 </li> <li> 456 </li> <li> 789 </li> </ul> </body> </html>