Heim > Web-Frontend > js-Tutorial > JavaScript-Reihe für Fortgeschrittene – Abschlüsse und Referenzen

JavaScript-Reihe für Fortgeschrittene – Abschlüsse und Referenzen

黄舟
Freigeben: 2017-02-08 09:46:08
Original
1063 Leute haben es durchsucht
  • 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
Nach dem Login kopieren

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;
};
Nach dem Login kopieren

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);
}
Nach dem Login kopieren

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);
}
Nach dem Login kopieren

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)
}
Nach dem Login kopieren

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)!


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