Eines der wichtigsten Merkmale in JavaScript ist die Verwendung von Schließungen. Aufgrund der Verwendung von Schließungen kann der aktuelle Umfang immer auf externe Bereiche zugreifen. Da JavaScript keinen Umfang auf Blockebene und nur Funktionsumfang hat, ist die Verwendung von Schließungen eng mit Funktionen verbunden.
Simulieren Sie private Variablen
Die Codekopie lautet wie folgt:
Funktionszähler (Start) {
var count = start;
zurückkehren {
Inkrement: function () {
zählen ++;
},
get: function () {
Rückgabezahl;
}
}
}
var foo = counter (4);
foo.increment ();
foo.get (); // 5
Hier gibt Counter zwei Schließungen zurück: Funktionsinkrement und erhalten. Diese beiden Funktionen behalten den Zugriff auf den Zählerbereich bei, sodass sie auf die im Zählbereich definierte variable Anzahl zugreifen können.
Arbeitsmechanismus privater Variablen
Da JavaScript keine Werte und Verweise auf Scopes zuweisen kann, gibt es im obigen Beispiel keine Möglichkeit, von außen direkt auf die interne private Variable zu greifen. Der einzige Weg besteht darin, darauf zuzugreifen, indem die Schließung definiert wird.
Die Codekopie lautet wie folgt:
var foo = neuer Zähler (4);
foo.hack = function () {
count = 1337;
};
Der obige Code ändert nicht den Wert der Zählvariablen innerhalb des Zählerbereichs, da Hack nicht im Zähler definiert ist. Der obige Code erstellt oder überschreibt nur die globale Variablenzahl.
Schließungen in der Schleife
Einer der einfachsten Fehler besteht darin, Schließungen innerhalb einer Schleife zu verwenden.
Die Codekopie lautet wie folgt:
für (var i = 0; i <10; i ++) {
setTimeout (function () {
console.log (i);
}, 1000);
}
Der obige Code gibt nicht 0 bis 9 aus, sondern zehnmal kontinuierlich.
Die obige Anonymität führt einen Hinweis auf die Variable i. Wenn die Funktion "Konsole.log" aufgerufen wird, um die Ausgabe zu starten, ist dies die endgültige Schleife und die Variable I ist bereits 10.
Um den oben genannten Fehler zu vermeiden, müssen wir bei jedem Schleifen eine Kopie der Variablen I erstellen.
Vermeiden Sie Zitatfehler
Um den Wert einer Variablen in der Schleife zu kopieren, besteht der beste Weg darin, der äußeren Ebene eine anonyme Funktion hinzuzufügen und sofort auszuführen.
Die Codekopie lautet wie folgt:
für (var i = 0; i <10; i ++) {
(Funktion (e) {
setTimeout (function () {
console.log (e);
}, 1000);
})(ich);
}
Diese externe anonyme Funktion nimmt die Schleifenvariable I als der erste 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. Darüber hinaus ändert sich der Wert dieses Parameters E aufgrund externer Schleifenänderungen nicht.
Es gibt eine andere Möglichkeit, den gleichen Effekt zu erzielen, nämlich eine anonyme Funktion in der anonymen Funktion in SetTimeout zurückzugeben:
Die Codekopie lautet wie folgt:
für (var i = 0; i <10; i ++) {
setTimeout ((Funktion (e) {
return function () {
console.log (e);
}
}) (i), 1000)
}
Darüber hinaus kann es auch durch die Bind -Methode erreicht werden.
Die Codekopie lautet wie folgt:
für (var i = 0; i <10; i ++) {
setTimeout (console.log.bind (console, i), 1000);
}
Lassen Sie uns am Ende des Artikels zusammenfassen:
(1) Schließung ist ein Designprinzip. Es vereinfacht Benutzeraufrufe, indem der Kontext analysiert wird, sodass der Benutzer seinen Zweck erreichen kann, ohne ihn zu kennen.
(2) Die Mainstream -Online -Artikel zur Analyse von Schließungen widersprechen tatsächlich dem Schließungsprinzip. Wenn Sie die Details des Verschlusses kennen müssen, um gut zu verwenden, ist dieser Verschluss ein Entwurfsausfall.
(3) Versuchen Sie, so wenig wie möglich zu lernen.