Ein Closure (auch lexikalisches Closure oder Funktions-Closure) ist eine Funktion, die zusammen mit ihrer definierenden Umgebung gespeichert wird. Es verbindet den Funktionscode mit den Variablen, die zum Zeitpunkt der Definition im umgebenden Geltungsbereich (Scope) existierten — auch wenn die Funktion später an anderer Stelle aufgerufen wird.

Funktion plus Umgebung

Operativ betrachtet ist ein Closure ein Datensatz aus zwei Teilen: dem Funktionscode und der Umgebung (Environment) mit den eingefangenen Variablen. Der Begriff geht auf Peter Landin zurück, der ihn 1964 für seine SECD-Maschine prägte — eine abstrakte Maschine zur Auswertung funktionaler Programme. Landin stellte Funktionen als Closures im Speicher dar, also als Paar aus Code und Umgebung für die freien Variablen.

Lexikalischer Geltungsbereich

Closures beruhen auf lexikalischem Scoping: Welche Variablen eine Funktion sehen kann, bestimmt ihre Position im Quellcode — nicht der Ort, an dem sie aufgerufen wird. In JavaScript ist dieses Verhalten Standard:

function zaehlerErzeugen() {
  let stand = 0;
  return function() {
    stand = stand + 1;
    return stand;
  };
}
const zaehlen = zaehlerErzeugen();
zaehlen(); // 1
zaehlen(); // 2

Die innere Funktion fängt die Variable stand ein. Sie bleibt auch nach dem Ende von zaehlerErzeugen() erhalten, weil das Closure die Umgebung am Leben hält.

Typische Anwendungen

  • Private Variablen und Information Hiding (Variablen, die von außen nicht erreichbar sind)
  • Module-Muster: gekapselter Zustand mit öffentlicher Schnittstelle
  • Event-Handler und Callbacks, die Kontextdaten mitführen
  • Currying, bei dem jede Zwischenfunktion ihre Argumente einfängt

Fallstricke

Closures in Schleifen sind ein klassischer Fehler: Binden alle Iterationen dieselbe Variable, zeigen am Ende alle Closures auf den letzten Wert (in JavaScript mit var, nicht mit let). Zudem hält ein Closure seine Umgebung im Speicher — ungenutzte Closures können so Speicherverbrauch verursachen.

Abgrenzung

Ein Callback ist eine übergebene Funktion; ein Closure ist der Mechanismus, mit dem diese Funktion ihre Umgebung einfängt. Closures sind eine direkte Folge von Erstklassige Funktionen und ein zentrales Werkzeug der Funktionalen Programmierung. Der eingefangene Zustand bleibt lokal und verursacht keine Seiteneffekte im globalen Bereich. Verwandte Grundlagen: Higher-Order-Funktion, Currying, Funktion.