Un modo semplice per creare un riferimento circolare è quello di avere un oggetto che si riferisce a se stesso in una proprietà:
function Foo() {
this.abc = "Hello";
this.circular = this;
}
var foo = new Foo();
alert(foo.circular.circular.circular.circular.circular.abc);
Qui l'oggetto foo
contiene un riferimento ad essa.
Con chiusure questo è solitamente più implicito, da solo avere il riferimento circolare portata, non come una proprietà esplicita di un oggetto:
var circular;
circular = function(arg) {
if (arg) {
alert(arg);
}
else {
// refers to the |circular| variable, and by that to itself.
circular("No argument");
}
}
circular("hello");
circular();
Qui la funzione memorizzata in circular
riferisce alla variabile circular
, e quindi a se stesso. Contiene implicitamente un riferimento a se stesso, creando un riferimento circolare. Anche se circular
ora esce dall'ambito, viene comunque fatto riferimento dall'ambito delle funzioni. I semplici garbage collector non riconoscono questo ciclo e non raccoglieranno la funzione.
Grazie per le risposte; Riesco a vedere l'esempio di Josh che accade in un'app di produzione in cui potrei avere molti eventi associati. Mi piacerebbe evitare che questa perdita si verifichi sui miei client che eseguono IE6. Correggetemi se ho torto ma questo è solo un problema con i browser IE6 e seguenti? La maggior parte dei browser moderni implementa un garbage collector in grado di trovare questo tipo di riferimenti? – MatthewJ