Was ist eine Schließung?
Schauen wir uns zuerst einen Code an:
Funktion a () {var n = 0; Funktion inc () {n ++; console.log (n); } Inc (); Inc (); }A(); // Konsolenausgänge 1 und dann 2 Ausgaben 2 AusgängeEs ist einfach. Schauen wir uns einen anderen Code an:
Funktion a () {var n = 0; this.inc = function () {n ++; console.log (n); };} var c = new a (); C.inc (); // Konsolenausgabe 1C.inc (); // Konsolenausgabe 2Es ist einfach.
Was ist eine Schließung? Das ist der Verschluss!
Funktionen, die Zugriff auf Variablen im Rahmen einer anderen Funktion haben, sind Schließungen. Hier zugreift die Inc -Funktion auf die Variable N im Konstruktor A, sodass ein Verschluss gebildet wird.
Schauen wir uns einen anderen Code an:
Funktion a () {var n = 0; Funktion inc () {n ++; console.log (n); } return inc;} var c = a (); c (); // Konsolenausgabe 1C (); // Konsolenausgabe 2Mal sehen, wie es ausgeführt wird:
var c = couter (), dieser Satz couter () gibt die Funktion Inc zurück, dieser Satz entspricht Var C = Inc;
c () ist dieser Satz inc () gleichwertig; Beachten Sie , dass der Funktionsname nur ein Kennung (ein Zeiger auf eine Funktion) ist, und () die Ausführungsfunktion.
Die nächsten drei Sätze übersetzt in: var c = Inc; Inc (); Inc (); gibt es einen Unterschied zwischen ihm und dem ersten Code? NEIN.
Was ist eine Schließung? Das ist der Verschluss!
Alle Lehrbuch -Tutorials verwenden gerne den letzten Absatz, um Schließungen zu veranschaulichen, aber ich denke, dies kompliziert das Problem. Was hier zurückgegeben wird, ist der Funktionsname. Schüler, die noch nie gesehen haben, dass die C/C ++ -Programmierung von Tan Haoqiang nicht sofort zwischen dem Bringing () oder nicht, was bedeutet, dass diese Schreibmethode mit einer Falle ausgestattet ist. Obwohl diese Schreibmethode deutlicher ist, möchte ich das Problem immer noch singen und Code 1 und Code 2 betrachten.
Warum müssen Sie so schreiben?
Wir wissen, dass jede Funktion von JS ein kleines schwarzes Zimmer ist. Es kann externe Informationen erhalten, aber die Außenwelt kann den Inhalt nicht direkt im Inhalt sehen. Wenn Sie die Variable N in einen kleinen dunklen Raum einfügen, mit Ausnahme der Inc -Funktion, gibt es keinen anderen Weg, um mit der Variablen n in Kontakt zu treten. Darüber hinaus wirkt sich die Variable n mit demselben Namen außerhalb der Funktion A nicht aus. Dies ist die sogenannte Verbesserung der "Kapselung".
Der Grund, warum Sie die Rückkehr zur Rückkehrfunktion verwenden müssen, um Inc zu identifizieren, liegt darin, dass die INC -Funktion nicht direkt außerhalb der A -Funktion aufgerufen werden kann. Return Inc ist daher mit der Außenseite verbunden. Dies in Code 2 assoziiert auch nur mit der Außenseite.
Gemeinsame Fallen
Schauen Sie sich das an:
Funktion createFunctions () {var result = new Array (); für (var i = 0; i <10; i ++) {result [i] = function () {return i; }; } return Ergebnis;} var funcs = createFunctions (); für (var i = 0; i <funcs.length; i ++) {console.log (funcs [i] ());}Auf den ersten Blick dachte ich, es gibt 0 ~ 9 aus, aber ich hatte nie erwartet, dass es 10 10 ausgibt?
Die Falle hier ist: Die Funktion mit () ist die Ausführungsfunktion! Ein einfacher Satz var f = function () {alert ('hi'); }; wird nicht auftauchen und der folgende Satz f (); führt den Code in der Funktion aus. Der obige Code wird übersetzt als:
var result = new array (), i; result [0] = function () {return i; }; // Die Funktion wird nicht ausgeführt, die Funktion bleibt unverändert und die I in der Funktion kann nicht ersetzt werden! Ergebnis [1] = function () {return i; }; // Die Funktion wird nicht ausgeführt, die Funktion bleibt unverändert und die I in der Funktion kann nicht ersetzt werden! ... result [9] = function () {return i; }; // Die Funktion wird nicht ausgeführt, die Funktion bleibt unverändert und die I in der Funktion kann nicht ersetzt werden! i = 10; funcs = result; result = null; console.log (i); // funcs [0] () soll die Rückgabe -I -Anweisung ausführen, die 10console.log (i) zurückgeben soll; // funcs [1] () soll die Rückgabe -I -Anweisung ausführen, die 10 ... console.log (i) zurückgeben soll; // funcs [9] () soll die Rückgabe -I -Anweisung ausführen, die zurücksend ist 10Warum nur die Müllsammlungsergebnisse, aber nicht ich? Weil ich immer noch von der Funktion verwiesen werde. Es ist wie in einem Restaurant, in dem Teller immer begrenzt sind, also wird der Kellner in die Patrouille Taiwan gehen, um leere Teller zu recyceln, aber wie wagen er es, die Teller zu sammeln, die immer noch Gemüse enthalten? Wenn Sie die Gerichte (= Null) in den Teller selbst manuell ausschütten, wird der Teller natürlich weggenommen. Dies ist der sogenannte Speicherrecycling-Mechanismus.
Wie der Wert von Ich immer noch beibehalten werden kann, sollte das Lesen von Beginn des Artikels tatsächlich nichts zu tun. Ist es nicht notwendig, ein Stück des Gerichts auf dem Teller zu essen, um ein Stück zu verlieren?
Lassen Sie uns zusammenfassen
Ein Schließ ist eine Variable, die eine Funktion auf eine andere Funktion bezieht. Da auf die Variable verwiesen wird, wird sie nicht recycelt, sodass sie zur Einkapselung einer privaten Variablen verwendet werden kann. Dies ist ein Vorteil und ein Nachteil. Unnötige Schließungen erhöhen nur den Speicherverbrauch! Bei der Verwendung von Schließungen sollten Sie außerdem darauf achten, ob der Wert der Variablen Ihren Anforderungen entspricht, da sie wie eine statische private Variable entspricht. Verschlüsse werden normalerweise mit vielen Dingen gemischt, und erst nachdem wir sie mit mehr Verständnis kontaktiert haben, können wir unser Verständnis vertiefen. Hier sprechen wir nur über grundlegende Dinge.
Link zu diesem Artikel: http://www.cnblogs.com/qieguo/p/5457040.html
Das Obige dreht sich alles um diesen Artikel, ich hoffe, es wird für das Lernen aller hilfreich sein.