1. Apa itu penutupan dan rantai ruang lingkup yang terlibat dalam penutupan tidak akan dibahas di sini.
2. Mekanisme Pengumpulan Sampah JavaScript
JavaScript tidak perlu memori bebas secara manual, menggunakan mekanisme pengumpulan sampah otomatis. Ketika suatu objek tidak berguna, yaitu, ketika tidak ada variabel dalam program mengacu pada objek, variabel akan dilepaskan dari memori.
Salinan kode adalah sebagai berikut:
var s = [1, 2,3];
var s = null;
// Dengan cara ini, array asli [1, 2, 3] akan dirilis.
3. Kutipan daur ulang
Tiga objek a, b, c
Aàbàc: Atribut tertentu dari A mengacu pada B, dan C juga dirujuk oleh atribut B. Jika A dibersihkan, maka B dan C juga dilepaskan.
Aàbàcàb: Atribut C tertentu ditambahkan di sini untuk merujuk ke objek B. Jika ini untuk membersihkan A, maka B dan C tidak akan dilepaskan karena referensi melingkar dihasilkan antara B dan C.
Salinan kode adalah sebagai berikut:
var a = {};
a.pro = {a: 100};
a.pro.pro = {b: 100};
a = null;
// Dalam hal ini, {a: 100} dan {b: 100} juga dirilis secara bersamaan.
var obj = {};
obj.pro = {a: 100};
obj.pro.pro = {b: 200};
var dua = obj.pro.pro;
obj = null;
// Dalam hal ini {b: 200} tidak akan dirilis, sedangkan {a: 100} akan dirilis.
4. Daur ulang referensi dan penutupan
Salinan kode adalah sebagai berikut:
fungsi luar () {
var obj = {};
function inner () {
// Objek OBJ dirujuk di sini
}
obj.inner = batin;
}
Ini adalah semacam referensi melingkar dan tersembunyi,. Ketika luar disebut sekali, dua objek OBJ dan bagian dalam dibuat di dalamnya. Properti batin OBJ mengacu pada batin; Batin yang serupa juga mengacu pada OBJ, karena OBJ masih berada di lingkungan tertutup Innerfun. Tepatnya, ini disebabkan oleh "rantai lingkup" JavaScript yang unik.
Oleh karena itu, penutupan sangat mudah untuk membuat referensi melingkar, dan untungnya JavaScript dapat menangani referensi melingkar seperti itu dengan sangat baik.
5. Bocor memori di IE
Ada beberapa kebocoran memori di IE, dan ada penjelasan terperinci di sini (http://msdn.microsoft.com/en-us/library/bb250448.aspx).
Hanya satu dari ini yang dibahas di sini, yaitu, kebocoran memori yang disebabkan oleh referensi melingkar, karena ini adalah situasi yang paling umum.
Ketika ada referensi loop antara elemen DOM atau objek ActiveX dan objek JavaScript normal, IE memiliki kesulitan khusus dalam melepaskan variabel tersebut. Yang terbaik adalah memotong referensi loop secara manual. Bug ini telah diperbaiki di IE 7 (http://www.quirksmode.org/blog/archives/2006/04/ie_7_and_javasc.html).
“IE 6 menderita kebocoran memori ketika referensi melingkar antara beberapa objek, di antaranya setidaknya satu dom node, dibuat. Masalah ini telah diselesaikan dalam IE 7.”
Jika OBJ dalam contoh di atas (titik 4) referensi bukan objek fungsi JavaScript (dalam), tetapi objek ActiveX atau elemen DOM, referensi melingkar yang dibentuk pada IE tidak dapat dilepaskan.
Salinan kode adalah sebagai berikut:
fungsi init () {
var elem = document.geteLementById ('id');
elem.onClick = function () {
alert ('Rain-Man');
// Elemen Elem dirujuk di sini
};
}
Elem mengacu pada fungsi mendengarkan acara klik, dan fungsi juga merujuk elemen Elem melalui rantai lingkupnya. Dengan cara ini, bahkan jika Anda meninggalkan halaman saat ini di IE, referensi melingkar ini tidak akan dirilis.
6. Solusi
Metode dasarnya adalah membersihkan referensi melingkar ini secara manual. Berikut ini adalah contoh yang sangat sederhana. Saat menggunakannya, Anda dapat membangun fungsi addEvent () sendiri dan menghapus semua binding acara pada acara Bongkar jendela.
Salinan kode adalah sebagai berikut:
fungsi luar () {
var one = document.geteLementById ('one');
One.onClick = function () {};
}
window.onunload = function () {
var one = document.geteLementById ('one');
satu.onClick = null;
};
Metode lain (oleh: Douglas Crockford)
Salinan kode adalah sebagai berikut:
/**
* Iterasi melalui node elemen tertentu dan semua elemen keturunan
*
* @param elem node simpul elemen yang akan dihapus
* Fungsi fungsi fungsi @param untuk diproses
*
*/
function walkthedom (node, func) {
func (node);
node = node.firstchild;
while (node) {
walkthedom (node, func);
node = node.nextsibling;
}
}
/**
* Hapus semua referensi dari simpul DOM untuk mencegah kebocoran memori
*
* @param elem node simpul elemen yang akan dihapus
*
*/
fungsi purgeeventhandlers (node) {
walkthedom (node, function (e) {
untuk (var n in e) {
if (typeof e [n] ===
'fungsi') {
e [n] = null;
}
}
});
Di atas adalah konten dan solusi yang relevan untuk kebocoran memori JavaScript. Teman yang membutuhkannya bisa merujuknya.