1. Der Umfang der Variablen
Um Schließungen zu verstehen, müssen Sie zuerst den besonderen variablen Bereich von JavaScript verstehen.
Es gibt nur zwei Arten von Variablenarten: globale Variablen und lokale Variablen.
Das spezielle Merkmal der JavaScript -Sprache ist, dass globale Variablen direkt in Funktionen gelesen werden können.
var n = 999; Funktion f1 () {alert (n); } f1 (); // 999Andererseits werden lokale Variablen innerhalb der Funktion natürlich nicht außerhalb der Funktion gelesen.
Funktion f1 () {var n = 999; } alert (n); // FehlerHier gibt es einen Platz zu beachten. Wenn Sie die Variablen intern deklarieren, müssen Sie den Befehl var verwenden. Wenn nicht, deklarieren Sie tatsächlich eine globale Variable!
Funktion f1 () {n = 999; } f1 (); Alarm (n); // 9992. Wie kann man lokale Variablen von außen lesen?
Aus verschiedenen Gründen müssen wir manchmal lokale Variablen innerhalb der Funktion erhalten. Wie bereits erwähnt, kann dies jedoch unter normalen Umständen nicht erfolgen und kann nur durch Problemumgehungen erreicht werden.
Das heißt, eine andere Funktion innerhalb der Funktion zu definieren.
Funktion f1 () {var n = 999; Funktion f2 () {alert (n); // 999}}Im obigen Code ist die Funktion F2 in Funktion F1 enthalten, und alle lokalen Variablen in F1 sind für F2 sichtbar. Aber umgekehrt ist nicht möglich. Lokale Variablen in F2 sind für F1 unsichtbar. Dies ist die "Chain Scope" -Struktur, die für die JavaScript -Sprache einzigartig ist. Die untergeordneten Objekte schauen für alle übergeordneten Objektvariablen auf der Ebene nach oben. Daher sind alle Variablen des übergeordneten Objekts für das untergeordnete Objekt sichtbar, sonst ist es nicht wahr.
Da F2 lokale Variablen in F1 lesen kann, können wir seine internen Variablen außerhalb von F1 nicht lesen, solange F2 als Rückgabewert verwendet wird?
Funktion f1 () {var n = 999; Funktion f2 () {alert (n); } return f2; } var result = f1 (); Ergebnis(); // 9993. Das Konzept der Schließung
Die F2 -Funktion im vorherigen Abschnitt des Code ist der Verschluss.
Die Definition von "Schließung" in verschiedenen beruflichen Dokumenten ist sehr abstrakt und schwer zu verstehen. Mein Verständnis ist, dass eine Schließung eine Funktion ist, die Variablen in anderen Funktionen lesen kann.
Da in JavaScript -Sprache nur Unterfunktionen innerhalb von Funktionen lokale Variablen lesen können, können Schließungen einfach als "in einer Funktion definierte Funktionen" verstanden werden.
Im Wesentlichen ist ein Verschluss eine Brücke, die das Innere und die Außenseite der Funktion verbindet.
4. Der Zweck der Schließung
Schließungen können an vielen Stellen verwendet werden. Es hat zwei größte Verwendungszwecke, eine ist, dass die Variablen in der Funktion wie oben erwähnt gelesen werden können, und das andere ist, dass die Werte dieser Variablen immer im Speicher gehalten werden.
Wie versteht man diesen Satz? Bitte beachten Sie den Code unten.
Funktion f1 () {var n = 999; nadd = function () {n+= 1} Funktion f2 () {alert (n); } return f2; } var result = f1 (); Ergebnis(); // 999 nadd (); Ergebnis(); // 1000In diesem Code ist das Ergebnis tatsächlich die F2 -Funktion des Verschlusss. Insgesamt wird zweimal ausgeführt, der erste Wert beträgt 999 und der zweite Wert beträgt 1000. Dies zeigt, dass die lokale Variable N in der Funktion F1 im Speicher gehalten wurde und nach dem Aufrufen von F1 nicht automatisch gelöscht wird.
Warum passiert das? Der Grund dafür ist, dass F1 die übergeordnete Funktion von F2 ist und F2 einer globalen Variablen zugeordnet ist, die dazu führt, dass F2 immer im Gedächtnis ist, und die Existenz von F2 hängt von F1 ab. Daher ist F1 immer im Gedächtnis und wird nach Abschluss des Anrufs nicht vom Müllsammlungsmechanismus recycelt.
Ein weiterer bemerkenswerter Punkt in diesem Code ist, dass die Zeile "nadd = function () {n+= 1}" zuerst vor NADD verwendet wird, sodass NADD eine globale Variable ist, keine lokale Variable. Zweitens ist der Wert von NADD eine anonyme Funktion, und diese anonyme Funktion selbst ist ebenfalls ein Verschluss, sodass NADD einem Setter entspricht, der auf lokalen Variablen innerhalb der Funktion außerhalb der Funktion arbeiten kann.
5. Hinweise zur Verwendung von Schließungen
1) Da Verschlüsse dazu führen, dass alle Variablen in der Funktion im Speicher gespeichert werden und der Speicherverbrauch sehr groß ist, können Verschlüsse nicht missbraucht werden, andernfalls verursacht dies Leistungsprobleme auf der Webseite und kann zu einem Speicherleck der IE führen. Die Lösung besteht darin, alle lokalen Variablen zu löschen, die vor dem Verlassen der Funktion nicht verwendet werden.
2) Der Verschluss ändert den Wert der Variablen innerhalb der übergeordneten Funktion außerhalb der übergeordneten Funktion. Wenn Sie die übergeordnete Funktion als Objekt verwenden, verwenden Sie den Verschluss als öffentliche Methode und die interne Variable als private Eigenschaft, achten Sie darauf, den Wert der internen Variablen der übergeordneten Funktion nicht nach Belieben zu ändern.