Closures gelten als eines der Themen, an denen JavaScript-Einsteiger hängen bleiben. Dabei ist die Sache erstaunlich handfest — man muss sie nur einmal an etwas sehen, das man tatsächlich baut.
Funktionen sind Werte
Der Ausgangspunkt ist unspektakulär: Eine Funktion lässt sich einer Variablen
zuweisen, weitergeben und zurückgeben. Genau das ist der Unterschied
zwischen einer Funktionsdeklaration und einem Funktionsausdruck — die eine
wird gehoistet und ist vor ihrer Zeile aufrufbar, der andere folgt den ganz
normalen Regeln von const und let.
Der Wert überlebt seine Funktion
Eine Closure entsteht, wenn eine Funktion sich Werte aus dem Bereich merkt, in dem sie erzeugt wurde. Schreibst du eine Funktion, die eine Prüffunktion zurückgibt, und übergibst ihr einen Grenzwert, dann trägt jede erzeugte Prüffunktion ihren eigenen Grenzwert mit sich — dauerhaft.
Das überrascht beim ersten Mal: Die äußere Funktion ist längst beendet, ihre Variable müsste weg sein. Ist sie aber nicht. Zwei Funktionen aus derselben Vorlage liefern deshalb für dieselbe Eingabe unterschiedliche, jeweils korrekte Antworten. Konfiguration einmal beim Erzeugen übergeben statt bei jedem Aufruf — das ist der praktische Nutzen.
Wer var benutzt, verliert die Grenzen
Der häufigste Stolperstein liegt eine Ebene tiefer, beim
Gültigkeitsbereich. var kennt nur Funktionsbereiche, keine Blöcke — wer
damit arbeitet, wundert sich über Werte, die aus einer Schleife herauslecken.
let und const halten sich an die geschweiften Klammern, und damit wird auch
nachvollziehbar, was eine Closure eigentlich einfängt.
Mehr dazu im Seminar
Von der ersten Funktion über Pfeilfunktionen bis zu Closures mit gemerkter Konfiguration führt das Modul Funktionen, Gültigkeitsbereiche und Closures — mit Video und Kapitelübersicht.