Heim > Web-Frontend > js-Tutorial > Hauptteil

Javascript-Studiennotizen – Funktionen (3): Abschlüsse und Referenzen_Grundkenntnisse

WBOY
Freigeben: 2016-05-16 16:30:36
Original
1357 Leute haben es durchsucht

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

Code kopieren Der Code lautet wie folgt:

Funktion Counter(start) {
var count = start;
Geben Sie {
zurück inkrementieren: function() {
Zählen ;
},
          get: function() {
              Rückgabeanzahl;
}
}
}
var foo = Counter(4);
foo.increment();
foo.get(); // 5

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.

Code kopieren Der Code lautet wie folgt:

var foo = new Counter(4);
foo.hack = function() {
Anzahl = 1337;
};

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.

Code kopieren Der Code lautet wie folgt:

for(var i = 0; i < 10; i ) {
setTimeout(function() {
console.log(i);
}, 1000);
}

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.

Code kopieren Der Code lautet wie folgt:

for(var i = 0; i < 10; i ) {
(Funktion(e) {
​​​​ setTimeout(function() {
console.log(e);
}, 1000);
})(i);
}

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:

Code kopieren Der Code lautet wie folgt:

for(var i = 0; i < 10; i ) {
setTimeout((function(e) {
         return function() {
console.log(e);
}
})(i), 1000)
}

Darüber hinaus kann dies auch durch die Bind-Methode erreicht werden.

Code kopieren Der Code lautet wie folgt:

for(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, 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.

Verwandte Etiketten:
Quelle:php.cn
Erklärung dieser Website
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
Beliebte Tutorials
Mehr>
Neueste Downloads
Mehr>
Web-Effekte
Quellcode der Website
Website-Materialien
Frontend-Vorlage