Heim > Artikel > Web-Frontend > JavaScript-Reihe für Fortgeschrittene – Abschlüsse und Referenzen
Mock Private Variables
Warum auf private Variablen nicht extern zugegriffen werden kann
Abschlüsse in Schleifen
Referenzfehler vermeiden
Das Schließen ist eine sehr wichtige Funktion von JavaScript, was bedeutet, dass der aktuelle Bereich immer auf die äußere Bereichsvariable zugreifen kann. Da Funktionen die einzigen Strukturen in JavaScript sind, die über einen eigenen Gültigkeitsbereich verfügen, ist die Erstellung von Abschlüssen auf Funktionen angewiesen.
Private Variablen simulieren
function Counter(start) { var count = start; return { increment: function() { count++; }, get: function() { return count; } } } var foo = Counter(4); foo.increment(); foo.get(); // 5
Hier gibt die Counter-Funktion zwei Abschlüsse zurück, die Funktion increment und die Funktion get. Beide Funktionen behalten einen Verweis auf den äußeren Bereich Counter bei, sodass sie immer auf die in diesem Bereich definierte Variablenanzahl zugreifen können.
Warum kann nicht extern auf private Variablen zugegriffen werden?
Da der Bereich in JavaScript nicht referenziert oder zugewiesen werden kann, gibt es keine Möglichkeit, extern auf die Zählvariable zuzugreifen. Der einzige Weg führt durch diese beiden Verschlüsse.
var foo = new Counter(4); foo.hack = function() { count = 1337; };
Der obige Code ändert nicht den Wert der im Counter-Bereich definierten Zählvariablen, da foo.hack in diesem Bereich nicht definiert ist. Dadurch wird die globale Variablenanzahl erstellt oder überschrieben.
Abschlüsse in Schleifen
Ein häufiger Fehler tritt bei der Verwendung von Abschlüssen in Schleifen auf, vorausgesetzt wir müssen die Schleifensequenznummer in jeder Schleife aufrufen
for(var i = 0; i < 10; i++) { setTimeout(function() { console.log(i); }, 1000); }
Die Der obige Code gibt nicht die Zahlen 0 bis 9 aus, sondern zehnmal die Zahl 10.
Wenn console.log aufgerufen wird, behält die anonyme Funktion einen Verweis auf die externe Variable i bei. Zu diesem Zeitpunkt ist die for-Schleife beendet und der Wert von i wurde auf 10 geändert.
Um das gewünschte Ergebnis zu erhalten, müssen Sie in jeder Schleife eine Kopie der Variablen i erstellen.
Referenzfehler vermeiden
Um die Schleifensequenznummer korrekt zu erhalten, ist es am besten, einen anonymen Wrapper zu verwenden (Anmerkung des Übersetzers: Tatsächlich ist es ist das, was wir normalerweise als anonyme Selbstausführungsfunktion bezeichnen.
for(var i = 0; i < 10; i++) { (function(e) { setTimeout(function() { console.log(e); }, 1000); })(i); }
Die externe anonyme Funktion wird sofort ausgeführt und verwendet i als Parameter. Zu diesem Zeitpunkt verfügt die e-Variable in der Funktion über eine Kopie von i.
Wenn die an setTimeout übergebene anonyme Funktion ausgeführt wird, hat sie einen Verweis auf e und dieser Wert wird durch die Schleife nicht geändert.
Es gibt eine andere Möglichkeit, die gleiche Aufgabe zu erfüllen, und zwar die Rückgabe einer Funktion von einem anonymen Wrapper. Dies hat den gleichen Effekt wie der obige Code.
for(var i = 0; i < 10; i++) { setTimeout((function(e) { return function() { console.log(e); } })(i), 1000) }
Das Obige ist der Inhalt der erweiterten JavaScript-Serie – Abschlüsse und Referenzen. Weitere verwandte Inhalte finden Sie auf der chinesischen PHP-Website (www.php.cn)!