Dieses Beispiel erzeugt eine interessante Objektverzeigerungsstruktur:
function f1 () {
var lokal = "bla";
window.f2 = function () { alert(lokal); }
}
f1();
f2();
Nachdem f1() terminiert hat, gibt keine direkte Referenz auf das dabei erzeugte Objekt.
Der Aufruf von f1() erzeugt ein lokales Function-Objekt im Scope von f1 - eine Referenz darauf wird an window.f2 zugewiesen - und die private Variable lokal.
Es existieren zwei Referenzen auf das Function-Objekt: Eine vom Scope von f1 und eine von window.f2
Das Funktionsobjekt enthält eine Referenz auf die f1-Instanz.
Damit existiert eine indirekte Referenz von window.f2 auf die f1-Instanz, die damit gültig bleibt, bis an window.f2 ein anderer Wert zugewiesen oder (die Varible!) window.f2 mit delete entsorgt wird - vorausgesetzt, es wurden zwischenzeitlich keine weiteren Referenzen erzeugt.
Die internen Abläufe in dieser Situation sind in den Details recht verwickelt, denn es muß geprüft werden, ob noch irgendwelche Referenzen auf ein Objekt vorhanden sind und wenn ja, ob es Zirkularreferenzen sind, die keinen externen Zugriff auf das Objekt mehr ermöglichen. Gerade im obigen Beispiel wird das ziemlich schwierig. (Wenn der Garbage-Collector dabei patzt, entsteht ein Speicherleck - der IE hatte zumindest mal derartige Probleme.)
Zum new-Operator: Er ist im Vergleich zu seinem Namensvetter in C++ geradezu ein Mickerling.
Er allokiert keinen Speicher, sondern gibt im Beispiel
var a = new f1();
nur eine Referenz auf die Instanz von f1 zurück, die beim Aufruf entstanden ist, die Instanz überlebt dadurch das Terminieren der Konstruktorfunktion.