Closures – Javascript mdn Bitcoin Kontroverse

init () erstellt eine lokale Variable namens name und eine Funktion namens displayName (). Die Funktion displayName () ist eine interne Funktion, die in init () definiert und nur im Rumpf der Funktion init () verfügbar ist. Die Funktion displayName () hat nicht lokale Variablen von seinen eigenen. Da interne Funktionen jedoch Zugriff auf externe Funktionsvariablen haben, kann displayName () auf den in der übergeordneten Funktion init () deklarierten Variablennamen zugreifen. Das Gleiche lokale Variablen in displayName () wird verwendet, wenn sie vorhanden sind.

Führen Sie den Code aus, und beachten Sie, dass die alert () – Anweisung in der displayName () – Funktion den Wert der Variablen name, die in der übergeordneten Funktion deklariert ist, erfolgreich anzeigt. Dies ist ein Beispiel für einen lexikalischen Bereich, der beschreibt, wie ein Analysator Variablennamen auflöst, wenn Funktionen verschachtelt sind.


Das Wort "lexikalisch" verweist auf die Tatsache, dass der lexikalische Bereich den Speicherort verwendet, an dem eine Variable im Quellcode deklariert ist, um zu bestimmen, wo diese Variable verfügbar ist. Geschachtelte Funktionen haben Zugriff auf deklarierte Variablen in ihrem äußeren Gültigkeitsbereich. Schließen

Auf den ersten Blick scheint es uninteressant zu sein, dass dieser Code immer noch funktioniert. In einigen Programmiersprachen ist die lokale Variablen in einer Funktion existiert nur für die Dauer der Ausführung dieser Funktion. Nachdem makeFunc () abgeschlossen ist, können Sie erwarten, dass auf die Name-Variable nicht mehr zugegriffen werden kann. Da der Code jedoch immer noch wie erwartet funktioniert, ist dies in JavaScript offensichtlich nicht der Fall.

Der Grund ist, dass Funktionen in JavaScript Closures bilden. Ein Verschluss ist die Kombination einer Funktion und lexikalische Umgebung in dem diese Funktion deklariert wurde. Diese Umgebung besteht aus allem lokale Variablen welche zum Zeitpunkt des Abschlusses im Umfang waren. In diesem Fall verweist myFunc auf die Instanz der displayName-Funktion, die beim Ausführen von makeFunc erstellt wird. Die Instanz von displayName behält eine Referenz auf ihre lexikalische Umgebung, in dem der Name der Variablen existiert. Wenn myFunc aufgerufen wird, bleibt der Name der Variablen daher weiterhin verfügbar "Mozilla" ist in Alarmbereitschaft geraten.

Grundsätzlich ist makeAdder eine Factory von Funktionen – es erstellt Funktionen, die ihrem Argument einen bestimmten Wert hinzufügen können. Im obigen Beispiel verwenden wir unsere Factory-Funktion, um zwei neue Funktionen zu erstellen – eine, die ihrem Argument 5 hinzufügt, und eine, die 10 hinzufügt.

Closures sind nützlich, weil Sie bestimmte zuordnen können lexikalische Umgebung) mit einer Funktion, die an diesen Daten arbeitet. Dies zeigt deutliche Parallelen zur objektorientierten Programmierung, bei der Objekte bestimmte Daten (die Eigenschaften des Objekts) mit einer oder mehreren Methoden verknüpfen können.

Situationen, in denen Sie dies tun möchten, sind besonders häufig im Internet. Ein Großteil des Codes, den wir im JavaScript-Frontend schreiben, ist ereignisbasiert – wir definieren ein Verhalten und hängen es dann an ein Ereignis an, das vom Benutzer ausgelöst wird (z. B. ein Klick oder ein Tastendruck). Unser Code wird normalerweise als Erinnerung angehängt: nur eine Funktion, die als Reaktion auf das Ereignis ausgeführt wird.

Angenommen, wir möchten einer Seite, die die Textgröße anpasst, Schaltflächen hinzufügen. Eine Möglichkeit besteht darin, die Schriftgröße des body-Elements in Pixel anzugeben und dann die Größe der anderen Elemente der Seite (z. B. Kopfzeilen) mithilfe der relativen em-Einheit festzulegen: body {

JavaScript bietet keine native Möglichkeit, dies zu tun, aber es ist möglich, private Methoden mit Closures zu emulieren. Private Methoden sind nicht nur nützlich, um den Codezugriff einzuschränken. Sie bieten auch eine leistungsstarke Möglichkeit, Ihren globalen Namespace zu verwalten, indem Sie vermeiden, dass unwichtige Methoden die öffentliche Schnittstelle Ihres Codes überfluten.

Teilen lexikalische Umgebung wird im Rumpf einer anonymen Funktion erstellt, die ausgeführt wird, sobald sie definiert wurde. die lexikalische Umgebung enthält zwei private Elemente: eine Variable namens privateCounter und eine Funktion namens changeBy. Auf keines dieser privaten Elemente kann direkt von außerhalb der anonymen Funktion zugegriffen werden. Sie müssen stattdessen auf die drei öffentlichen Funktionen zugreifen können, die vom anonymen Wrapper zurückgegeben werden.