Heim  >  Artikel  >  Web-Frontend  >  Abschlüsse in JavaScript beherrschen: Eine vollständige Anleitung mit Beispielen

Abschlüsse in JavaScript beherrschen: Eine vollständige Anleitung mit Beispielen

Linda Hamilton
Linda HamiltonOriginal
2024-11-21 11:46:14510Durchsuche

Mastering Closures in JavaScript: A Complete Guide with Examples

Einführung

Stellen Sie sich vor, Sie entwickeln spät in der Nacht eine App, während Sie mit einem Kaffee in der Hand einen JavaScript-Code debuggen, der sich … mysteriös verhält. Es geht darum, eine Funktion innerhalb einer anderen Funktion aufzurufen, Werte auf eine Art und Weise beizubehalten, die Sie nicht erwartet haben, und Ihre console.log-Anweisungen machen die Sache nicht klarer. Plötzlich wird Ihnen klar, dass es sich um ein Problem handelt, von dem Sie bisher nur gehört haben: Schließungen.

Abschlüsse in JavaScript werden oft als etwas magisches oder abstraktes Konzept dargestellt. Aber sie sind tatsächlich ein grundlegender Teil davon, wie JavaScript mit Funktionen und Umfang umgeht, und wenn man sie versteht, kann die mitternächtliche Codierungssitzung zu einem „Aha!“ werden. Moment statt einer frustrierenden Erfahrung. In diesem Leitfaden werden Abschlüsse so aufgeschlüsselt, dass sie zugänglich, nützlich und sogar unterhaltsam sind, mit Einblicken und Beispielen, die über die Grundlagen hinausgehen.

Was sind Schließungen?

Abschlüsse sind eine Funktion von JavaScript, bei der eine innere Funktion Zugriff auf die Variablen der äußeren (umschließenden) Funktion hat, auch nachdem die Ausführung der äußeren Funktion abgeschlossen ist. Dies geschieht, weil JavaScript die Umgebung (den lexikalischen Bereich), in der die Funktion erstellt wurde, „schließt“ und den Kontext im Speicher behält. Das Ergebnis? Funktionen, die sich an die Umgebung „erinnern“ können, in der sie erstellt wurden, und so leistungsstarke Funktionen wie Datenschutz, Memoisierung und mehr ermöglichen.

Reale Definition von Schließungen

Stellen Sie sich vor, Sie leben in einem Haus mit mehreren Räumen und haben einen Schlüssel, der einen bestimmten Raum aufschließt – nennen wir ihn „Datenraum“. Der Schlüssel symbolisiert einen Abschluss. Selbst wenn die Haupttür (die Funktion, die den Schlüssel erstellt hat) verschlossen ist, haben Sie immer noch Zugang zum Datenraum, da Sie den Schlüssel behalten haben. Ebenso behält ein Abschluss den Zugriff auf Variablen in seiner ursprünglichen Funktion, auch wenn diese Funktion bereits abgeschlossen ist.

Warum Schließungen für Entwickler wichtig sind

Abschlüsse sind die Grundlage für die Erstellung privater Variablen und funktionaler Muster wie Currying und Memoisieren. Laut der Entwicklerumfrage von Stack Overflow ist JavaScript die beliebteste Programmiersprache und wird von fast 65 % der professionellen Entwickler verwendet. Daher ist ein solides Verständnis von Abschlüssen für die effektive Nutzung von JavaScript unerlässlich.


Funktionsweise von Abschlüssen in JavaScript: Beispiele und Muster

Beispiel für einen einfachen Abschluss

Beginnen wir mit einem einfachen Beispiel, das zeigt, wie Schließungen in der Praxis funktionieren.

function createCounter() {
  let count = 0;
  return function() {
    count++;
    return count;
  };
}

const counter = createCounter();
console.log(counter()); // Output: 1
console.log(counter()); // Output: 2

Das passiert in diesem Code:

  1. Die Funktion „createCounter“ definiert eine lokale Variablenanzahl.
  2. Die innere Funktion (der Abschluss) erhöht die Zählvariable und gibt sie zurück.
  3. Auch wenn die Ausführung von createCounter abgeschlossen ist, hat die innere Funktion immer noch Zugriff auf count – das ist ein Abschluss in Aktion.

Dieses Beispiel mag einfach erscheinen, aber es zeigt ein wichtiges Merkmal von Verschlüssen: die Erhaltung des Zustands.


Tiefer gehen: Fortgeschrittene Anwendungsfälle von Schließungen

1. Datenschutz mit Schließungen

Einer der wirkungsvollsten Anwendungsfälle für Schließungen ist die Schaffung von Datenschutz, einer Technik, die es uns ermöglicht, den direkten Zugriff auf bestimmte Variablen oder Funktionen einzuschränken.

function createCounter() {
  let count = 0;
  return function() {
    count++;
    return count;
  };
}

const counter = createCounter();
console.log(counter()); // Output: 1
console.log(counter()); // Output: 2

Hier ist das Guthaben privat und kann nur über Einzahlung und getBalance abgerufen oder geändert werden. Dies ähnelt der Funktionsweise privater Felder in OOP, aber in JavaScript verwenden wir Schließungen, um dies zu erreichen.

2. Currying-Funktionen mit Verschlüssen

Currying ist ein funktionales Programmiermuster, das Abschlüsse nutzt, um die teilweise Anwendung von Funktionen zu ermöglichen.

function bankAccount(initialBalance) {
  let balance = initialBalance;

  return {
    deposit(amount) {
      balance += amount;
    },
    getBalance() {
      return balance;
    }
  };
}

const myAccount = bankAccount(1000);
myAccount.deposit(500);
console.log(myAccount.getBalance()); // Output: 1500
console.log(myAccount.balance); // Output: undefined

In diesem Beispiel erstellt der Multiplikator einen Abschluss, der den Zugriff auf den Faktor beibehält und es uns ermöglicht, spezielle Funktionen wie Double oder Triple zu erstellen, indem wir einfach verschiedene Faktoren übergeben.


Häufige Fallstricke und wie man sie vermeidet

Verschlüsse in Schleifen

Abschlüsse können Entwickler aus der Fassung bringen, wenn sie innerhalb von Schleifen verwendet werden. Ein typisches Problem besteht darin, dass Schließungen die Variable der Schleife und nicht ihren aktuellen Wert erfassen.

Betrachten Sie dieses Beispiel:

function multiplier(factor) {
  return function(number) {
    return number * factor;
  };
}

const double = multiplier(2);
console.log(double(5)); // Output: 10

Ausgabe:

for (var i = 0; i < 3; i++) {
  setTimeout(function() {
    console.log(i);
  }, 1000);
}

Da i in allen Iterationen der Schleife gemeinsam genutzt wird, wird der Endwert von i (3) dreimal gedruckt. Um dieses Problem zu lösen, verwenden Sie let, um eine Variable mit Blockbereich zu erstellen, oder erstellen Sie einen Abschluss innerhalb der Schleife:

3
3
3

Jetzt wird die Ausgabe wie erwartet 0, 1, 2 sein, da jede Funktion ihre eigene Kopie von i (hier j) hat.


Leistungsüberlegungen

Abschlüsse können Speicher verbrauchen, da sie Variablen aus äußeren Bereichen festhalten. Achten Sie bei Hochleistungsanwendungen auf Speicherlecks, indem Sie Abschlüsse bereinigen, wenn sie nicht mehr benötigt werden, insbesondere bei Anwendungen mit langer Laufzeit. Tools wie Chrome DevTools bieten Speicherprofilierungstools, mit denen Sie die Speichernutzung identifizieren und optimieren können.


Praktische Anwendungen in JavaScript-Frameworks

Abschlüsse sind in gängigen Frameworks wie React von grundlegender Bedeutung, wo Hooks wie useState und useEffect Abschlüsse verwenden, um Werte und Zustände zwischen Renderings zu „merken“. Das Verständnis von Abschlüssen kann entmystifizieren, wie diese Hooks unter der Haube funktionieren, und es einfacher machen, optimierten, fehlerfreien Code zu schreiben.


Abschließende Gedanken: Das Beste aus Abschlüssen machen

Das Beherrschen von Abschlüssen kann die Tür zu vielen fortgeschrittenen Programmiertechniken öffnen. Sie sind für das Schreiben von JavaScript-Code unerlässlich, der sauber, modular und effizient ist. Scheuen Sie sich nicht vor Abschlüssen, sondern nutzen Sie sie als leistungsstarkes Werkzeug in Ihrem JavaScript-Toolkit.


Quellen

  1. Mozilla Developer Network (MDN): Schließungen
  2. JavaScript: The Definitive Guide von David Flanagan

Das Verständnis von Abschlüssen hilft Ihnen nicht nur, Code schneller zu debuggen, sondern schafft auch eine solide Grundlage für die Beherrschung der funktionsbasierten Struktur von JavaScript und hilft Ihnen beim reibungslosen Übergang in Frameworks, Backend-Programmierung mit Node.js und mehr. Unabhängig davon, ob Sie eine skalierbare App erstellen oder hochgradig interaktive Frontends erstellen, Closings sind eine Fähigkeit, die es zu beherrschen gilt.

Das obige ist der detaillierte Inhalt vonAbschlüsse in JavaScript beherrschen: Eine vollständige Anleitung mit Beispielen. 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