Perbincangan terperinci tentang kemahiran JavaScript leaks_javascript memori

WBOY
Lepaskan: 2016-05-16 16:31:28
asal
1114 orang telah melayarinya

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.

Salin kod Kod adalah seperti berikut:

var s = [1, 2,3];
var s = null;
//Dengan cara ini tatasusunan asal [1,2,3] akan dikeluarkan.

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.

Salin kod Kod adalah seperti berikut:

var a = {};
a.pro = { a:100 };
a.pro.pro = { b:100 };
a = null ;
//Dalam kes ini, {a:100} dan {b:100} juga dikeluarkan pada masa yang sama.
                                                                    var obj = {};
Obj.pro = { a : 100 };
Obj.pro.pro = { b : 200 };
var dua = obj.pro.pro;
Obj = null; //Dalam kes ini {b:200} tidak akan dikeluarkan, tetapi {a:100} akan dikeluarkan.


4. Rujukan dan penutupan pekeliling

fungsi outer(){
var obj = {};
fungsi dalam(){
//Objek obj dirujuk di sini
}
         obj.batin = batin;
}


Ini adalah rujukan pekeliling yang sangat tersembunyi. Apabila luar dipanggil sekali, dua objek, obj dan dalam, akan tercipta di dalamnya. Sifat dalaman obj merujuk kepada inner juga merujuk kepada obj Ini kerana obj masih dalam persekitaran innerFun tepat, ini Ia disebabkan oleh "rantai skop" JavaScript yang unik. Oleh itu, adalah sangat mudah untuk penutupan membuat rujukan pekeliling Nasib baik, JavaScript boleh mengendalikan rujukan pekeliling tersebut dengan baik.


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.

Salin kod Kod adalah seperti berikut:

Funktion init(){
        var elem = document.getElementByid( 'id' );
          elem.onclick = function(){
alarm('rain-man');
//Das Elem-Element
wird hier referenziert         };
}

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.

Code kopieren Der Code lautet wie folgt:

Funktion äußere(){
         var one = document.getElementById( 'one' );
         one.onclick = function(){};
}
​ window.onunload = function(){
         var one = document.getElementById( 'one' );
         one.onclick = null;
};

Andere Methoden (von: Douglas Crockford)

Code kopieren Der Code lautet wie folgt:

/**
* Durchlaufen Sie einen Elementknoten und alle seine untergeordneten Elemente
*
* @param Elem node Der zu löschende Elementknoten
* @param function func Die Funktion zur Verarbeitung von
*
​*/
Funktion walkTheDOM(node, func) {
func(node);
node = node.firstChild;
while (Knoten) {
         walkTheDOM(node, func);
Node = node.nextSibling; }
}
/**
* Löschen Sie alle Verweise auf Dom-Knoten, um Speicherlecks zu verhindern
*
* @param Elem node Der zu löschende Elementknoten
*
​*/
Funktion purgeEventHandlers(node) {
walkTheDOM(node, function (e) {
for (var n in e) {                                   If (typeof e[n] ===
                      'Funktion') {
                 e[n] = null;
            }
}
});


Das Obige ist der relevante Inhalt und die Lösungen für JavaScript-Speicherlecks. Freunde in Not können darauf verweisen
Label berkaitan:
sumber:php.cn
Kenyataan Laman Web ini
Kandungan artikel ini disumbangkan secara sukarela oleh netizen, dan hak cipta adalah milik pengarang asal. Laman web ini tidak memikul tanggungjawab undang-undang yang sepadan. Jika anda menemui sebarang kandungan yang disyaki plagiarisme atau pelanggaran, sila hubungi admin@php.cn
Tutorial Popular
Lagi>
Muat turun terkini
Lagi>
kesan web
Kod sumber laman web
Bahan laman web
Templat hujung hadapan