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