Può qualcuno spiegare questo scenario di perdita di memory javascript per me

http://www.ibm.com/developerworks/web/library/wa-memleak/ In questo collegamento, l'elenco 5 descrive una situazione in cui obj è un riferimento ad un elemento dom e l'elemento dom ha un riferimento a obj e causa quindi una perdita di memory. Sto lottando per vedere che cosa nel codice fa l'elemento DOM avere un riferimento a obj. Potrebbe qualcuno spiegarlo a me?

Tratto dalla pagina:

Nel Listato 5 viene visualizzata una chiusura in cui un object JavaScript (obj) contiene un riferimento ad un object DOM (indicato dall'elemento "id"). L'elemento DOM, a sua volta, ha un riferimento allo JavaScript obj. Il riferimento circolare risultante tra l'object JavaScript e l'object DOM provoca una perdita di memory.

Listato 5. Schema di perdita di memory di gestione degli events

<html> <body> <script type="text/javascript"> document.write("Program to illustrate memory leak via closure"); window.onload=function outerFunction(){ var obj = document.getElementById("element"); obj.onclick=function innerFunction(){ alert("Hi! I will leak"); }; obj.bigString=new Array(1000).join(new Array(2000).join("XXXXX")); // This is used to make the leak significant }; </script> <button id="element">Click Me</button> </body> </html> 

la perdita di memory esiste a causa del riferimento circolare tra obj e onclick .

Normalmente, dopo l'esecuzione di onload , tutte le variables nel suo field di applicazione saranno raccolte e cancellate. Nel javascript tuttavia, un ambito di function non viene sempre eliminato dopo l'esecuzione. Si chiama chiusure .

Ad esempio, se un object esterno riferisce qualcosa in questo ambito. In questo caso, i riferimenti onclick all'esternoFunction e all'esternoFunction sono riferiti da obj

illustrazione di una perdita di memoria causata dalla chiusura

Se obj fosse impostato su null , non ci sarebbe un riferimento a qualcosa all'interno dell'ambito di carico .

Si può sostenere che il riferimento sia ancora all'esternoFunzione , che è corretto. Ma l'esternoFunction non è più legato all'ambito di carico , rendendo questo ambito valido per essere pulito dal collettore di spazzatura.