Schließungen genauer ansehen.

Jan 08 2023
'Closure' ist die Kombination einer gebündelten Funktion mit Verweisen auf ihren umgebenden Zustand (Lexical Environment). Bevor wir weitermachen, sind einige Dinge zu beachten, um Closures zu verstehen: 1- Ausführungskontext 2- Call Stack 3- Bereichskette Der Ausführungskontext.

'closure' ist die Kombination einer gebündelten Funktion mit Verweisen auf ihren umgebenden Zustand ( Lexical Environment ).

Bevor wir weitermachen, sind einige Dinge zu beachten, um Closures zu verstehen:

1- Ausführungskontext

2- Anrufliste

3- Bereichskette

Der Ausführungskontext.

Es gibt zwei Arten von Ausführungskontexten:-

1- Globaler Ausführungskontext (Global EC)

2- Lokaler Ausführungskontext (Lokales EC)

const name = 'Anup Verma'
function callMe(a,b){
let x = 5;
  console.log('params :: ',a,b,'name :: ',name ,'x :: ',x);
}
callMe(2,3);

Globale und lokale EC in Aktion

HINWEIS :

Der lokale EC einer Funktion enthält Informationen zu seinen „ Argumenten“ , dem Schlüsselwort „ this“ und den darin deklarierten „ Variablen“ .

Aber im Fall einer Pfeilfunktion und einer anonymen Funktion sind das Schlüsselwort „ this“ und „Arguments“ NICHT vorhanden .

Der Call-Stack.

Der Ort, an dem all die Magie passiert.

Der Aufrufstapel ist der Ort, an dem jeder einzelne Ausführungskontext in Form eines Stapels platziert und ausgeführt und „ ausgeblendet“ wird, sobald die Ausführung abgeschlossen ist.

Betrachten Sie das folgende Beispiel.

const counting = function(){
  let count = 0; 
  return function(){
      count++;
      console.log('count :: ', count);
  }
}
const counter = counting();

counter(); //count :: 1
counter(); //count :: 2
counter(); //count :: 3

Rufen Sie den Stack auf, wenn die Zählung ausgeführt wird
Links : Nachdem die Ausführung des Zählvorgangs abgeschlossen ist, wird er aus dem Aufrufstapel entfernt

Wie Sie den beiden unteren Bildern entnehmen können, hat die „ Counter-Funktion“ auch dann Zugriff auf die Variablen in der Umgebung, in der sie erstellt wurde (dh counting()) , obwohl die Zählfunktion nicht mehr im Aufrufstapel vorhanden ist. ).

Schließungen.

Jede Funktion hat immer Zugriff auf die Variablenumgebungen des Ausführungskontexts , in dem die Funktion erstellt wurde, selbst nachdem dieser Ausführungskontext verschwunden ist .

Die Funktion „ Counter() “ wurde im Ausführungskontext der Funktion „Counting()“ geboren , daher erhält diese Funktion „Counter()“ Zugriff auf die Variablenumgebung (dh „ count“ ) .

WAS ist Schließung?

Closure ist diese Variable Environment , die an die Funktion angehängt ist, genau so, wie sie zu der Zeit und am Ort war, als die Funktion erstellt wurde, und die Bereichskette wird durch diese Closure 'bewahrt'.

Dank dieses „ Abschlusses “ verliert eine Funktion nicht die Verbindung zu Variablen, die am Geburtsort der Funktion existierten.

Obwohl dies eines der Themen ist, die die Leute gerne vergessen, hier sind einige intuitive Beispiele/Analogien, die Ihnen helfen sollen zu verstehen, worum es bei Closures geht.

Informelle Definition(en)

Eine Closure gibt einer Funktion ' Zugriff ' auf alle Variablen ihrer Elternfunktion , selbst nachdem die Elternfunktion zurückgekehrt ist . Die Funktion behält eine „ Referenz“ zu ihrem äußeren SCOPE bei, wodurch die Bereichskette durchgehend „ bewahrt“ wird.

Es ist wie bei einer Person, die die Verbindung zu ihrer HEIMATSTADT nicht verliert, in dieser Analogie
Person -> Funktion
Heimatstadt -> Übergeordneter Geltungsbereich

PERSON — — —> Verbindung — — —> HEIMSTADT ( — — → Variablen )

Und die Person verliert nicht die Verbindung zu den Variablen, die in ihrem übergeordneten Geltungsbereich, dh ihrem Heimatort, gespeichert sind.

FAZIT

Wir müssen „Closures“ nicht manuell erstellen , das ist etwas, was JavaScript vollständig automatisch macht, außerdem gibt es keine Möglichkeit , explizit auf diese „Closure“-Variablen zuzugreifen, weil „ein Closure KEIN greifbares JavaScript-Objekt ist“.