Christoph: Closures und Garbage Collection

Beitrag lesen

Moin.

Falls die in Safari eingesetzte JS Engine hinreichend gut optimiert, tritt das beschriebene Problem erst gar nicht auf: Da in den inneren Funktionen kein eval() vorkommt, muss die Closure keine Referenz auf die komplette lexikale Umgebung der äußeren Funktion bereithalten, sondern nur Referenzen auf die tatsächlich benötigten Objekte.

Falls die Engine tatsächlich die komplette lexikale Umgebung referenziert, sollte das Überschreiben von lokal mit undefined oder null das Problem wie gewünscht lösen. Ein delete würde zusätzlich zum Löschen der Objektreferenz auch noch den für die Referenz selbst benötigten Speicher (den Pointer in der Slot-Tabelle des Objekts) freigeben, was aber für das Variablen-Objekt einer Funktion (auf das ohnehin nicht direkt zugegriffen werden kann) nicht vorgesehen ist (ES5 in strict-mode wirft hier sogar einen ReferenceError).

Im IE ist besondere Vorsicht geboten, da dort DOM-Knoten über reference-counting entsorgt werden, d.h. zirkuläre Referenzen führen zu Speicherlecks (beachte Listing 5: Event handling memory leak pattern).

Ansonsten können Closures als Event-Handler oft ganz vermieden werden, indem man den DOM-Knoten als Kommunikationsmittel ge-(/miss-?)braucht.

Christoph