Eine der wichtigsten Funktionen in Javascript ist die Verwendung von Verschlüssen. Aufgrund der Verwendung von Abschlüssen kann der aktuelle Bereich immer auf externe Bereiche zugreifen. Da Javascript keinen Gültigkeitsbereich auf Blockebene, sondern nur einen Funktionsumfang hat, ist die Verwendung von Abschlüssen eng mit Funktionen verknüpft.
Mock Private Variables
Hier gibt Counter zwei Abschlüsse zurück: Funktionen inkrementieren und get. Diese beiden Funktionen behalten den Zugriff auf den Counter-Bereich bei, sodass sie immer auf die im Counter-Bereich definierte Variablenanzahl zugreifen können.
Wie private Variablen funktionieren
Da Javascript keine Bereiche zuweisen oder darauf verweisen kann, gibt es im obigen Beispiel keine Möglichkeit, von außen direkt auf die interne Anzahl privater Variablen zuzugreifen. Der einzige Weg, darauf zuzugreifen, besteht darin, einen Abschluss zu definieren.
Der obige Code ändert den Wert der Zählvariablen im Zählerbereich nicht, da der Hack nicht im Zähler definiert ist. Der obige Code erstellt oder überschreibt nur die globale Variablenanzahl.
Abschluss innerhalb einer Schleife
Einer der häufigsten Fehler ist die Verwendung von Verschlüssen innerhalb von Schlaufen.
Der obige Code gibt nicht 0 bis 9 aus, sondern 10 Mal kontinuierlich.
Durch die obige Anonymität bleibt immer ein Verweis auf die Variable i erhalten. Wenn die Funktion console.log aufgerufen wird, um die Ausgabe zu starten, ist die Schleife beendet und die Variable i ist bereits 10.
Um den oben genannten Fehler zu vermeiden, müssen wir bei jedem Schleifendurchlauf eine Kopie des Werts der Variablen i erstellen.
Zitierfehler vermeiden
Um den Wert der Variablen in der Schleife zu kopieren, ist es am besten, eine anonyme Funktion zur sofortigen Ausführung in der äußeren Ebene hinzuzufügen.
Diese äußere anonyme Funktion empfängt die Schleifenvariable i als ersten Parameter und kopiert ihren Wert in ihren eigenen Parameter e.
Die externe anonyme Funktion übergibt den Parameter e an setTimeout, sodass setTimeout einen Verweis auf den Parameter e hat. Und der Wert dieses Parameters e ändert sich nicht aufgrund externer Schleifenänderungen.
Es gibt eine andere Möglichkeit, den gleichen Effekt zu erzielen, nämlich die Rückgabe einer anonymen Funktion in der anonymen Funktion innerhalb von setTimeout:
Darüber hinaus kann dies auch durch die Bind-Methode erreicht werden.
Lassen Sie uns am Ende des Artikels zusammenfassen:
(1) Schließung ist ein Designprinzip, das die Aufrufe des Benutzers durch die Analyse des Kontexts vereinfacht und es dem Benutzer ermöglicht, sein Ziel zu erreichen, ohne es zu wissen
(2) Die gängigen Artikel zur Verschlussanalyse im Internet widersprechen tatsächlich dem Verschlussprinzip. Wenn Sie die Details des Verschlusses kennen müssen, ist der Verschluss ein Konstruktionsfehler
(3) Lernen Sie so wenig wie möglich.