Heim  >  Artikel  >  Web-Frontend  >  Nehmen Sie sich eine Minute Zeit, um JavaScript-Abschlüsse zu verstehen

Nehmen Sie sich eine Minute Zeit, um JavaScript-Abschlüsse zu verstehen

黄舟
黄舟Original
2017-02-23 13:33:50894Durchsuche


Was ist eine Schließung?

Schauen wir uns zunächst einen Code an:

function a(){
    var n = 0;
    function inc() {
        n++;
        console.log(n);
    }
    inc();  
    inc(); 
}
a(); //控制台输出1,再输出2

Es ist ganz einfach. Schauen wir uns noch einmal einen Code an:

function a(){
    var n = 0;
    this.inc = function () {
        n++; 
        console.log(n);
    };
}
var c = new a();
c.inc();    //控制台输出1
c.inc();    //控制台输出2

Es ist ganz einfach.

Was ist Schließung? Das ist Schluss!

Funktionen, die Zugriff auf Variablen im Gültigkeitsbereich einer anderen Funktion haben, sind Abschlüsse. Hier greift die Funktion inc auf die Variable n im Konstruktor a zu, sodass ein Abschluss gebildet wird.

Schauen wir uns noch einmal einen Code an:

function a(){
    var n = 0;
    function inc(){
       n++; 
       console.log(n);
    }
    return inc;
}
var c = a();
c();    //控制台输出1
c();    //控制台输出2

Schauen wir uns an, wie er ausgeführt wird:

var c = couter(), dieser Satz couter() gibt zurück die Funktion inc, dann entspricht dieser Satz var c = inc;

 c(), dieser Satz entspricht inc(); Beachten Sie, dass der Funktionsname nur ein Bezeichner (Zeiger auf die Funktion) ist. und () ist die Ausführungsfunktion.

Die Übersetzung der nächsten drei Sätze lautet: var c = inc(); inc();, unterscheidet sie sich vom ersten Code? NEIN.

Was ist Schließung? Das ist Schluss!

Alle Lehrbuch-Tutorials verwenden gerne den letzten Absatz, um Abschlüsse zu erklären, aber ich denke, das verkompliziert das Problem. Was hier zurückgegeben wird, ist der Funktionsname. Schüler, die die C/C++-Programmierung von Tan Haoqiang nicht gesehen haben, erkennen möglicherweise nicht sofort den Unterschied zwischen der Verwendung von () und nicht. Mit anderen Worten, diese Schreibweise hat ihre eigene Falle. Obwohl diese Schreibweise eleganter ist, möchte ich das Problem dennoch vereinfachen. Schauen Sie sich Code 1 und Code 2 an. Haben Sie immer noch Probleme mit dem Funktionsaufruf?

Warum schreibst du das so?

Wir wissen, dass jede Funktion von js ein kleiner dunkler Raum ist, der externe Informationen erhalten kann, aber die Außenwelt kann den Inhalt im Inneren nicht direkt sehen. Platzieren Sie die Variable n in einem kleinen schwarzen Raum. Es gibt keine andere Möglichkeit, auf die Variable n mit demselben Namen außerhalb der Funktion a zuzugreifen. Dies ist die sogenannte erweiterte „Kapselung“.

Der Grund, warum return verwendet wird, um den Funktionsbezeichner inc zurückzugeben, liegt darin, dass die Funktion inc nicht direkt außerhalb der Funktion a aufgerufen werden kann, sodass return inc mit der Außenseite verknüpft ist. Dies in Code 2 verknüpft auch inc mit draußen. .

Häufige Fallen

Sehen Sie sich das an:

function createFunctions(){
    var result = new Array();
    for (var i=0; i < 10; i++){
        result[i] = function(){
            return i;
        };
    }
    return result;
}
var funcs = createFunctions();
for (var i=0; i < funcs.length; i++){
    console.log(funcs[i]());
}

Auf den ersten Blick dachte ich, dass es 0~9 ausgibt, aber Das ist absolut nicht der Fall. Denken Sie darüber nach, 10 10s auszugeben?

Die Falle hier ist: Die Funktion mit () ist die Ausführungsfunktion! Ein einfacher Satz wie var f = function() { Alert(‘Hi’); wird kein Fenster öffnen, nur wenn er von f(); gefolgt wird. Die Übersetzung des obigen Codes lautet:

var result = new Array(), i;
result[0] = function(){ return i; }; //没执行函数,函数内部不变,不能将函数内的i替换!
result[1] = function(){ return i; }; //没执行函数,函数内部不变,不能将函数内的i替换!
...
result[9] = function(){ return i; }; //没执行函数,函数内部不变,不能将函数内的i替换!
i = 10;
funcs = result;
result = null;

console.log(i); // funcs[0]()就是执行 return i 语句,就是返回10
console.log(i); // funcs[1]()就是执行 return i 语句,就是返回10
...
console.log(i); // funcs[9]()就是执行 return i 语句,就是返回10

Warum werden nur Ergebnisse erfasst, nicht aber ich? Weil ich immer noch durch die Funktion referenziert werde. Genau wie in einem Restaurant sind die Teller immer begrenzt, also patrouilliert der Kellner am Tisch, um die leeren Teller einzusammeln, aber wie kann er es wagen, die Teller einzusammeln, auf denen noch Gemüse ist? Wenn Sie das Geschirr auf dem Teller manuell leeren (=null), wird der Teller natürlich mitgenommen. Dies ist der sogenannte Memory-Recycling-Mechanismus.

Was die Frage betrifft, wie der Wert von „i“ noch erhalten werden kann, sollte es tatsächlich keinen Grund zur Sorge geben, nachdem man den Artikel von Anfang an gelesen hat. Sollte nach dem Verzehr nicht ein Stück vom Essen auf dem Teller fehlen?

Zusammenfassend

Ein Abschluss ist eine Funktion, die auf eine Variable einer anderen Funktion verweist. Da auf die Variable verwiesen wird, wird sie nicht recycelt und kann daher zum Kapseln einer privaten Variablen verwendet werden . Dies ist sowohl ein Vorteil als auch ein Nachteil. Unnötige Schließungen erhöhen nur den Speicherverbrauch! Darüber hinaus sollten Sie bei der Verwendung von Abschlüssen auch darauf achten, ob der Wert der Variablen Ihren Anforderungen entspricht, da es sich um eine statische private Variable handelt. Abschlüsse werden normalerweise mit vielen Dingen verwechselt. Nur wenn Sie mehr kontaktieren, können Sie Ihr Verständnis vertiefen. Dies ist nur der Anfang, um über die grundlegenden Dinge zu sprechen.

Das oben Genannte wird eine Minute dauern, um den Inhalt von JavaScript-Abschlüssen zu verstehen. Weitere verwandte Inhalte finden Sie auf der chinesischen PHP-Website (www.php.cn)!


Stellungnahme:
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