Heim >Web-Frontend >js-Tutorial >JavaScript-Abschlüsse im Detail

JavaScript-Abschlüsse im Detail

小云云
小云云Original
2018-02-07 14:51:511749Durchsuche

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 Abschluss
function 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
词法作用域
-Status, sodass der lexikalische Bereich der bei der Rückgabe generierten Funktion dem Bereich des obigen count() entspricht. Wenn also a() ausgeführt wird, ist sein tatsächlicher Gültigkeitsbereich

. Wenn also add zum ersten Mal aufgerufen wird, wird 1 zurückgegeben und beim zweiten Mal wird 2 zurückgegeben.

5. Zusammenfassung
add运行时的作用域
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:

Detailliertes Verständnis von JavaScript-Abschlüssen

Eine Zusammenfassung von JavaScript-Abschlüssen

Einfache Anwendung von JavaScript-Abschlussbeispielen

Das obige ist der detaillierte Inhalt vonJavaScript-Abschlüsse im Detail. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!

Stellungnahme:
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