1. Apakah penutupan dan rantaian skop yang terlibat dalam penutupan tidak akan dibincangkan di sini.
2. Mekanisme pengumpulan sampah JavaScript
JavaScript tidak perlu mengeluarkan memori secara manual, ia menggunakan mekanisme pengumpulan sampah automatik (kutipan sampah). Apabila objek tidak berguna, iaitu, apabila tiada pembolehubah dalam program merujuk kepada objek, pembolehubah akan dilepaskan daripada ingatan.
3. Rujukan pekeliling
Tiga objek A, B, C
AàBàC: Atribut tertentu A merujuk kepada B, dan C juga dirujuk oleh atribut B. Jika A dibersihkan, maka B dan C juga dilepaskan.
AàBàCàB: Di sini atribut C tertentu ditambahkan untuk merujuk objek B Jika ini adalah untuk mengosongkan A, maka B dan C tidak akan dikeluarkan kerana rujukan bulat dijana antara B dan C.
5. Kebocoran memori dalam IE
Terdapat beberapa jenis kebocoran memori dalam IE, dan terdapat penjelasan terperinci di sini (
http://msdn.microsoft.com/en-us/library/bb250448.aspx). Hanya satu daripadanya yang dibincangkan di sini, iaitu kebocoran memori yang disebabkan oleh rujukan bulat, kerana ini adalah situasi yang paling biasa.
Apabila terdapat rujukan bulat antara elemen DOM atau objek ActiveX dan objek JavaScript biasa, IE mengalami kesukaran khusus dalam melepaskan pembolehubah tersebut adalah yang terbaik untuk memotong rujukan bulatan ini secara manual 7 (
http://www.quirksmode.org/blog/archives/2006/04/ie_7_and_javasc.html). "IE 6 mengalami kebocoran memori apabila rujukan bulat antara beberapa objek, di antaranya sekurang-kurangnya satu nod DOM, telah diwujudkan dalam IE 7. "
Jika dalam contoh di atas (titik 4) obj tidak merujuk kepada objek Fungsi JavaScript (dalam), tetapi kepada objek ActiveX atau elemen Dom, rujukan bulat yang terbentuk dalam IE tidak boleh dikeluarkan.
Elem bezieht sich auf seine Click-Event-Listening-Funktion, die über ihre Scope-Kette auch auf das Elem-Element verweist. Auf diese Weise werden diese Zirkelverweise auch dann nicht freigegeben, wenn Sie die aktuelle Seite im IE verlassen.
6. Lösung
Die grundlegende Methode besteht darin, diesen Zirkelverweis manuell zu löschen. In einer tatsächlichen Anwendung können Sie selbst eine addEvent()-Funktion erstellen und alle Ereignisbindungen für das Entladeereignis des Fensters löschen.
Andere Methoden (von: Douglas Crockford)