OOP mit JavaScript - Closures
1. Der Sinn
... von Closures ist mir lange Zeit verschlossen geblieben. Dachte ich zumindest, bis ich mich des Themas angenommen habe. Und oh Wunder, ich selber arbeite damit schon seit Jahren, ohne es zu wissen. Denn das Konzept ist normalerweise(!) recht intuitiv.
2. Garbage Collection
Wie schön, dass man endlich mal an die Leute von der Müllabfuhr denkt. Die sind ja wichtig genug. OK, zurück zum Thema. Garbage Collection bedeutet in der Programmierung, dass automatisch alles aus dem Arbeitsspeicher gelöscht wird, was man nicht braucht.
Bei JavaScript hängt das natürlich von den Browserherstellern ab, aber ich denke, dass die sich mittlerweile an die vorgegebenen Standards halten. Zunächst mal gilt die einfache Regel, dass "private" Eigenschaften oder lokale Variablen innerhalb von Konstruktoren und normalen Funktionen nach dem Aufruf aus dem Speicher gelöscht werden und somit nicht zur Verfügung stehen.
3. Das Prinzip
Bei einem Closure werden die Variablen, oder genauer gesagt die Eigenschaften, eingeschlossen, wenn man in einer Methode darauf zugreift. Sie bleiben also erhalten und können später ohne Probleme wieder aufgerufen werden. Dazu ein Beispiel.
function Konstruktor ()
{
var bla = 'blubb';
var anonym = function()
{
alert(bla);
}
this.methode = function()
{
anonym();
}
}
var instanz = new Konstruktor();
document.getElementById('button').onclick = function()
{
instanz.methode();
}
Erläuterung
Zunächst mal haben wir die private Eigenschaft var bla
mit dem Wert blubb
. Nun wird deren äußere
(Konstruktor-) Funktion mit var instanz = new Konstruktor();
aufgerufen. Durch die Garbage Collection sollte daher die
private Eigenschaft bla
aus dem Speicher gelöscht werden.
Wird sie aber nicht
Denn durch den Aufruf in der anonymen Funktion bleibt sie erhalten. Das gilt auch für die "Methode" var anonym = function()
.
Denn sie wurde ebenfalls in einer Variablen gespeichert. Die wird jetzt ebenfalls "gekapselt" und zwar durch den Aufruf in der
öffentlichen Methode this.methode
.
Hä? Wat is?
Ihr müsst euch das so vorstellen. Wir haben die Konstruktorfunktion Konstruktor
. Die wird aufgerufen über var instanz
= new Konstruktor();
. Der Zugriff auf die Methode this.methode
erfolgt aber erst, wenn man auf ein HTML-Element mit
der ID button
klickt. Also müssten eigentlich die Eigenschaft bla
und die in der Variablen anonym
abgespeicherte anonyme Funktion bereits aus dem Speicher entfernt worden sein. Das geschieht aber nicht, da beide durch den Aufruf
erhalten bleiben. Und die Funktionen/Methoden, die dafür sorgen, sind die Closures.
4. Und was soll das?
Nun, ohne Closures würde uns hier alles um die Ohren fliegen. Allerdings gibt es ein paar Feinheiten, zu denen ich jetzt komme.
zurück zum vorherigen Abschnitt weiter zum nächsten Abschnitt