WikiDer > Verschluss

Closure

In dem Informatik ist ein Schließung eine Funktion, die verwendet Variablen die sich im . befinden erreichen in dem die Funktion definiert ist, aber nicht unbedingt in dem Geltungsbereich, in dem die Funktion aufgerufen wird.

Solche Variablen eines Abschlusses werden zusammen die Umfeld Schließung genannt.

Viele Programmiersprachen unterstützen Funktionen, aber keine Closures. Unterstützung für Schließungen gibt es hauptsächlich in funktional Programmiersprachen (wie z Haskell und OCaml), Programmiersprachen, die stark auf funktionalen Sprachen basieren (wie z Javascript) oder Sprachen, denen nachträglich funktionale Elemente hinzugefügt wurden (wie z C#).

Beispiel in JavaScript

varcreateClosure=Funktion(ein){RückkehrFunktion(b){Rückkehreinb;};};

Die obige JavaScript-Funktion gibt eine Closure zurück: die Variable ein gehört zur Umgebung der zurückgegebenen Funktion, ist aber außerhalb der Funktion createClosure nicht bekannt.

Diese Abschlüsse können wir Variablen zuweisen:

varVerschluss1=createClosure(3);varVerschluss2=createClosure(8);

und dann als separate Funktionen aufrufen:

varX=Verschluss1(4);// x ist jetzt 7varja=Verschluss2(4);//y ist jetzt 12

Die beiden Funktionen Verschluss1 und Verschluss2 beide haben ihre eigene Version der Variablen ein. Es ist ein Teil der Umgebung, die geschaffen wurde, als createClosure hieß. Sie sind weder lokale Variablen der Funktion selbst noch globale Variablen.

Private Variablen

Mit Hilfe von Closures ist es möglich, einer Funktion eine oder mehrere private Variablen zuzuweisen, die zwischen den verschiedenen Aufrufen dieser Funktion bestehen bleiben.

Das folgende Beispiel in JavaScript mag dies verdeutlichen:

varcreateClosure=Funktion(){varein=0;RückkehrFunktion(){ein;Rückkehrein;};};

Die Funktion createClose() gibt wieder eine Schließung zurück:

varf=createClosure();varG=createClosure();

Die Funktionen f() und G() jetzt hat jeder eine private Variable ein, die zwischen Anrufen bestehen bleibt:

varX=f();// x ist jetzt 1varja=f();//y ist jetzt 2!varz=G();// z ist jetzt 1varw=f();//w ist jetzt 3varv=G();// v ist jetzt 2

Das funktioniert also anders als wenn ein war eine lokale Variable (dann würde der Wert zwischen den Aufrufen nicht beibehalten) und auch anders als wenn ein eine globale Variable war (dann würden beide Funktionen dieselbe Variable ändern).

Die Operation ähnelt der von Objektvariablen (Attributen) in objektorientierten Programmierung - obwohl hier Funktionen anstelle von Objekten instanziiert werden. (Übrigens sind in JavaScript Funktionen Objekte.)