Die Closure ist eine große Schwierigkeit in JavaScript und zugleich ihr Merkmal. Viele fortgeschrittene Anwendungen beruhen auf Closures.

1. Gültigkeitsbereich von Variablen

Um Closures zu verstehen, muss man zunächst das besondere Variablen-Scoping von JavaScript verstehen.

Es gibt nur zwei Arten von Variablen-Gültigkeitsbereichen: globale Variablen und lokale Variablen.

Das Besondere an JavaScript ist, dass Funktionen darin globale Variablen direkt lesen können, aber lokale Variablen innerhalb einer Funktion können außerhalb der Funktion nicht gelesen werden.

Hinweis:Wenn du Variablen innerhalb einer Funktion deklarierst, verwende unbedingt den Befehl var. Wenn du das nicht tust, deklarierst du tatsächlich eine globale Variable!

2. Wie liest man lokale Variablen innerhalb einer Funktion von außen?

Aus verschiedenen Gründen müssen wir manchmal auf lokale Variablen innerhalb einer Funktion zugreifen. Wie oben erwähnt, ist dies jedoch unter normalen Umständen unmöglich! Es lässt sich nur durch Umwege erreichen.

Das heißt, definiere eine weitere Funktion innerhalb der Funktion.

function f1(){
    var n=999;
    function f2(){
        alert(n); // 999
    }
}

Im obigen Code ist die Funktion f2 innerhalb der Funktion f1 enthalten. An diesem Punkt sind alle lokalen Variablen innerhalb von f1 für f2 sichtbar. Aber das Umgekehrte gilt nicht; lokale Variablen innerhalb von f2 sind für f1 nicht sichtbar.

Dies ist die für JavaScript einzigartige "Ketten-Scope"-Struktur.

Untergeordnete Objekte suchen Ebene für Ebene, um alle Variablen der übergeordneten Objekte zu finden. Daher sind alle Variablen des übergeordneten Objekts für untergeordnete Objekte sichtbar, aber nicht umgekehrt.

Da f2 lokale Variablen in f1 lesen kann, können wir dann nicht, solange wir f2 als Rückgabewert zurückgeben, die internen Variablen von f1 von außerhalb von f1 lesen?

3. Das Konzept der Closures

Die Funktion f2 im obigen Code ist eine Closure.

Die Definitionen von Closures in verschiedenen Fachtexten sind sehr abstrakt. Mein Verständnis ist: Eine Closure ist eine Funktion, die interne Variablen anderer Funktionen lesen kann.

Da in JavaScript nur Unterfunktionen innerhalb einer Funktion lokale Variablen lesen können, kann eine Closure einfach als "eine innerhalb einer anderen Funktion definierte Funktion" verstanden werden.

Im Wesentlichen ist eine Closure also eine Brücke, die das Innere einer Funktion mit dem Äußeren der Funktion verbindet.

4. Verwendungszwecke von Closures

Closures können an vielen Stellen verwendet werden. Sie haben zwei größte Verwendungszwecke: einer besteht darin, Variablen innerhalb einer Funktion zu lesen, wie bereits erwähnt, und der andere darin, die Werte dieser Variablen jederzeit im Speicher zu halten, sodass sie nach dem Aufruf von f1 nicht automatisch gelöscht werden.

Warum ist das so? Der Grund dafür ist, dass f1 die übergeordnete Funktion von f2 ist und f2 einer globalen Variablen zugewiesen wird. Dadurch bleibt f2 immer im Speicher, und da die Existenz von f2 von f1 abhängt, bleibt auch f1 immer im Speicher und wird nach dem Ende des Aufrufs nicht vom Garbage-Collection-Mechanismus erfasst.

Eine weitere bemerkenswerte Stelle in diesem Code ist"nAdd=function(){n+=1}"diese Zeile. Erstens wird vor nAdd das Schlüsselwort var nicht verwendet, daher ist nAdd eine globale Variable und keine lokale Variable. Zweitens ist der Wert von nAdd eine anonyme Funktion, und diese anonyme Funktion selbst ist ebenfalls ein Closure, daher entspricht nAdd einem Setter, der von außerhalb der Funktion auf lokale Variablen innerhalb der Funktion zugreifen und diese bearbeiten kann.

5. Hinweise zur Verwendung von Closures

  • (1) Da Closures dazu führen, dass Variablen in Funktionen im Speicher gehalten werden, ist der Speicherverbrauch hoch. Daher dürfen Closures nicht übermäßig verwendet werden, sonst verursacht dies Leistungsprobleme bei Webseiten und kann in IE zu Speicherlecks führen. Die Lösung besteht darin, alle nicht verwendeten lokalen Variablen zu löschen, bevor die Funktion verlassen wird.
  • (2) Closures können die Werte von Variablen innerhalb der übergeordneten Funktion von außerhalb der übergeordneten Funktion ändern. Wenn Sie also die übergeordnete Funktion als Objekt verwenden, das Closure als ihre öffentliche Methode und die internen Variablen als ihre privaten Eigenschaften, müssen Sie darauf achten, die Werte der Variablen innerhalb der übergeordneten Funktion nicht beiläufig zu ändern.

Original-Link: https://www.cnblogs.com/cxying93/p/6103375.html