Heim  >  Artikel  >  Web-Frontend  >  [JavaScript] Abschlüsse in Sekundenschnelle verstehen

[JavaScript] Abschlüsse in Sekundenschnelle verstehen

王林
王林Original
2024-08-26 21:31:35903Durchsuche

[JavaScript] Understand closures in  seconds

Obwohl Abschlüsse eine grundlegende Idee in JavaScript sind, können Neulinge sie vage und schwer zu verstehen finden. Insbesondere die Definition des ECMA-Standards kann ohne praktische Erfahrung schwer zu verstehen sein. Daher gehen wir in diesem Beitrag nicht ausführlich auf die Erläuterung des Begriffs „Closures“ ein, sondern machen es Ihnen durch die Verwendung von tatsächlichem Code verständlicher.

1. Schließung

function A(name){
    function B(){
       console.log(name);
    }
    return B;
}
var C = A("Closure");
C();//Closure

Dies ist der einfachste Verschluss.

Da wir nun die Grundlagen kennen, wollen wir kurz untersuchen, wie sich diese von einer typischen Funktion unterscheidet. So sieht der oben genannte Code aus, wenn er in natürliche Sprache übersetzt wird:

  1. Definieren Sie eine normale Funktion A mit dem Argumentnamen
  2. Definieren Sie eine reguläre Funktion B in A und verweisen Sie in B auf den externen Variablennamen
  3. B in A zurückgeben
  4. Führen Sie A aus und weisen Sie das Ergebnis der Variablen C zu
  5. Führen Sie C aus

Eine Anweisung kann diese fünf Operationen zusammenfassen:

Funktion B innerhalb von Funktion A und Variablenname werden von Variable C außerhalb von Funktion A referenziert.

Mit einer kleinen Modifikation definiert diese Anweisung einen Abschluss wie folgt:

Wenn eine innere Funktion durch eine Variable außerhalb der äußeren Funktion referenziert wird, wird ein Abschluss gebildet.

Daher definiert die Durchführung der oben genannten fünf Vorgänge einen Abschluss.

Verwendungsmöglichkeiten von Verschlüssen

Bevor wir die Verwendung von Abschlüssen verstehen, wollen wir uns mit dem GC-Mechanismus (Garbage Collection) von JavaScript befassen.

Wenn in JavaScript ein Objekt nicht mehr referenziert wird, wird es vom GC zurückgefordert, andernfalls bleibt es weiterhin im Speicher.

Im obigen Beispiel hängt B von A ab, da B innerhalb von A definiert ist, und A wird indirekt von C referenziert, da die externe Variable C auf B verweist.

Das heißt, A wird nicht vom GC erfasst und bleibt weiterhin im Speicher. Um diese Argumentation zu beweisen, verbessern wir das obige Beispiel leicht.

function A(){
    var count = 0;
    function B(){
       count ++;
       console.log(count);
    }
    return B;
}
var C = A();
C();// 1
C();// 2
C();// 3
  1. Wenn wir var C = A(); aufrufen, wird A ausgeführt, wodurch eine Zählvariable und eine interne Funktion B erstellt werden. Da A B zurückgibt, hat die C-Variable tatsächlich einen Verweis auf B. Die Funktion B kann dann darauf zugreifen Zählvariable in A.
  2. Funktion B kann auf die Zählvariable in A zugreifen, da B ein Abschluss ist. Dies liegt daran, dass B ein Abschluss ist und Abschlüsse den Kontext beibehalten, in dem sie erstellt werden (z. B. lokale Variablen).
  3. Wenn C() aufgerufen wird, ruft es tatsächlich Funktion B auf. Bei jedem Aufruf von C() erhöht B den Wert von count und zeigt diesen Wert auf der Konsole an.
  4. Der Ausführungskontext von A endet, wenn B erstellt wird, aber die lokalen Variablen von A werden nicht zurückgefordert, solange B auf seine lokalen Variablen verweist (z. B. count).
  5. Erst wenn B nicht mehr referenziert wird, werden die Zählvariable und andere lokale Variablen in A wiederhergestellt. Da in diesem Beispiel C immer noch auf B verweist, wird weder der Wert von count noch der Ausführungskontext von A wiederhergestellt.

Warum wird die Zählung nicht zurückgesetzt?

Verschlussmechanismus:

  • Der Abschluss behält den Zählzustand bei und hält ihn für die interne Funktion B zugänglich. Selbst wenn der Ausführungskontext von A beendet wird, bleibt der Zählzustand im Speicher, da B weiterhin auf diesen Zustand verweist.
  • Bei jedem Aufruf von B: Jeder Aufruf von C() ist eigentlich ein Aufruf von B(), das den im Abschluss gespeicherten Zähler verwendet und ihn nicht neu initialisiert.

Wenn Sie also einige Variablen in einem Modul definieren und diese Variablen im Speicher behalten, aber die globalen Variablen nicht „verschmutzen“ möchten, können Sie dieses Modul mithilfe von Abschlüssen definieren.

Das obige ist der detaillierte Inhalt von[JavaScript] Abschlüsse in Sekundenschnelle verstehen. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!

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