Dieser Artikel stellt Ihnen hauptsächlich JavaScript-Verschlüsse im Detail vor. Apropos Verschlüsse: Ich glaube, dass alle Studenten, die Frontends schreiben, es wissen, und ich glaube, dass Verschlüsse mehr oder weniger in tatsächlichen Projekten verwendet wurden. Was genau ist ein Verschluss und wie kommt er zustande?
1. Was ist ein Abschluss
, der im Artikel von Lehrer Ruan erwähnt wird:
Ein Abschluss ist eine Funktion, die die internen Variablen anderer Funktionen lesen kann. Da in der Javascript-Sprache nur Unterfunktionen innerhalb der Funktion lokale Variablen lesen können, können Abschlüsse einfach als „innerhalb einer Funktion definierte Funktionen“ verstanden werden.
2. Die Funktionen von Abschlüssen
Eine besteht darin, die Variablen innerhalb der Funktion zu lesen, und die andere darin, die Werte dieser Variablen im Speicher zu behalten.
3. Eine einfache Abschlussinstanz
Das Rückgabeergebnis von () ist die Funktion, die in der Funktion count() zurückgegeben wird einem zugeordnet. Zu diesem Zeitpunkt wird die in count() definierte lokale Variable num im Speicher gespeichert. Wenn a() zum ersten Mal aufgerufen wird, wird ++num zurückgegeben, was 1 ist; wenn a() zum zweiten Mal aufgerufen wird, ist das zurückgegebene Ergebnis 2 4. Gründe für den Abschlussfunction count() { let num = 0; return function add() { return ++num; } }let a = count(); a(); //1a(); //2
Ich glaube, viele Menschen sind über dieses Problem verwirrt. Sie denken, dass eine Funktion eine Funktion zurückgibt und somit einen Abschluss bildet. Tatsächlich ist dies nur die Art des Schließens, nicht der Grund. Der Grund wird weiter unten erläutert. Der Hauptgrund, warum
generiert wird, liegt darin, dass JavaScript einen lexikalischen Gültigkeitsbereich hat, das heißt, ihm wurde ein Gültigkeitsbereich zugewiesen, als die Funktion
definiert. Zur Laufzeit wird ihm dann ein Laufzeitbereich zugewiesen, der auf der tatsächlichen Ausführungssituation basiert. Nur über diese beiden Bereiche kann eine JS-Funktion korrekt ausgeführt werden.
Nehmen Sie das obige Beispiel als Beispiel. Wenn count() ausgeführt wird, ist der Umfang der Funktion Wenn count() ausgeführt wird und die Funktion add zurückgegeben wird, da add vorhanden ist
definiert den
运行时作用域 num = 0 |
---|
词法作用域 |
. Wenn also add zum ersten Mal aufgerufen wird, wird 1 zurückgegeben und beim zweiten Mal wird 2 zurückgegeben.
5. Zusammenfassungadd运行时的作用域 |
---|
count运行时作用域 num = 0 |
count词法作用域 |
Aus der obigen Beschreibung ist ersichtlich, dass beim Generieren eines Abschlusses die lokalen Variablen (Laufzeitbereich) der externen Funktion als lexikalisch verwendet werden Interne Funktion Der Bereich wird im Speicher gespeichert, sodass dieser Speicherblock erst freigegeben wird, wenn die interne Funktion freigegeben wird. Daher müssen Sie bei der Verwendung von Schließungen sehr vorsichtig sein, um Speicherlecks zu vermeiden.
Verwandte Empfehlungen: