Closures in JavaScript: Einfach erklärt und unter der Haube

Online Python-Trainer für Anfänger

Lernen Sie Python einfach ohne theoretische Überlastung. Lösen Sie praktische Aufgaben mit automatischer Überprüfung und schreiben Sie Code direkt im Browser.

Kurs starten

Wie funktionieren Closures in JavaScript: Eine Analyse anhand eines Beispiels von Stack Overflow

\n\n

Wenn Sie jemals nach „JavaScript closures“ gegoogelt oder Diskussionen auf Stack Overflow gelesen haben, sind Sie sicher auf die berühmte Frage gestoßen: „How do JavaScript closures work?“. Dieser Thread hat tausende Aufrufe und hunderte Antworten gesammelt – von einfachen Erklärungen bis hin zu tiefen Einblicken in die V8-Engine. Warum? Weil Closures eines dieser Konzepte sind, die zunächst wie Magie erscheinen und dann zu Ihrer Superwaffe werden.

\n\n

In diesem Artikel werden wir nicht einfach die Theorie wiederholen. Wir werden unter die Haube von JavaScript schauen, analysieren, was im Speicher passiert, und endlich verstehen, warum dieser Code genau so und nicht anders funktioniert. Bereit? Los geht's.

\n\n

Was ist ein Closure? Definition ohne Schnörkel

\n\n

Beginnen wir mit dem Kern. Ein Closure ist eine Funktion, die sich an Variablen aus ihrem äußeren Gültigkeitsbereich „erinnert“, selbst nachdem die äußere Funktion ihre Arbeit bereits beendet hat.

\n\n

Klingt wie ein Zauberspruch? Kommen wir direkt zum Code. Hier ist ein klassisches Beispiel, das Sie auf Stack Overflow finden:

\n\n
function createCounter() {\n    let count = 0;\n    return function() {\n        count++;\n        return count;\n    };\n}\n\nconst counter = createCounter();\nconsole.log(counter()); // 1\nconsole.log(counter()); // 2\nconsole.log(counter()); // 3
\n\n

Hier gibt createCounter eine anonyme Funktion zurück. Diese innere Funktion „schließt“ die Variable count ein. Selbst nachdem createCounter abgearbeitet ist (wir denken, dass alle Variablen darin verschwinden sollten), lebt count weiter und ändert sich bei jedem Aufruf von counter(). Genau das ist ein Closure.

\n\n

Unter der Haube: Die lexikalische Umgebung

\n\n

Um zu verstehen, wie das funktioniert, müssen wir in das Innere der JavaScript-Engine schauen. Jede Funktion hat bei ihrer Erstellung eine versteckte Eigenschaft [[Environment]]. Sie speichert einen Verweis auf die lexikalische Umgebung (Lexical Environment), in der die Funktion erstellt wurde.

\n\n

Eine lexikalische Umgebung ist einfach ein Objekt, das Folgendes enthält:

\n
    \n
  • Einen Umgebungsdatensatz (Environment Record) – alle Variablen und Funktionen, die in diesem Gültigkeitsbereich deklariert sind.
  • \n
  • Einen Verweis auf die äußere Umgebung (outer) – den übergeordneten Gültigkeitsbereich.
  • \n
\n\n

Wenn wir eine Funktion aufrufen, wird eine neue lexikalische Umgebung für diesen Aufruf erstellt. Die innere Funktion erhält über die Scope Chain Zugriff auf die Variablen der äußeren Funktion.

\n\n

Kehren wir zu unserem Beispiel zurück. Wenn wir createCounter deklarieren, wird eine globale lexikalische Umgebung erstellt. Darin befinden sich die Variable createCounter (die Funktion) und counter (noch undefined).

\n\n

Wenn wir createCounter() aufrufen:

\n
    \n
  1. Wird eine neue lexikalische Umgebung für diesen Aufruf erstellt. In ihr befindet sich die Variable count = 0.
  2. \n
  3. Wird eine anonyme Funktion erstellt. Ihre [[Environment]] zeigt auf die aktuelle Umgebung (in der count lebt).
  4. \n
  5. Wird die Funktion zurückgegeben und counter zugewiesen.
  6. \n
\n\n

Und hier kommt das Interessanteste: createCounter ist beendet, aber ihre lexikalische Umgebung wird nicht vom Garbage Collector gelöscht! Weil es einen Verweis darauf gibt – die [[Environment]] der inneren Funktion. Die Umgebung bleibt im Speicher, solange die Funktion counter selbst existiert.

\n\n

Jedes Mal, wenn wir nun counter() aufrufen, wird eine neue Umgebung für diesen Aufruf erstellt, die über die Kette die alte Umgebung mit count sieht. So erhalten wir den Effekt des „Erinnerns“.

\n\n

Warum ist das wichtig? Reale Szenarien

\n\n

Closures sind nicht nur ein akademisches Konzept. Sie werden überall eingesetzt. Lassen Sie uns einige praktische Beispiele durchgehen.

\n\n

1. Private Variablen (Kapselung)

\n\n

In JavaScript gibt es keine echten

Blogs

Buchempfehlungen