Hauptmenü

Untermenü

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