Rumah > hujung hadapan web > Soal Jawab bahagian hadapan > Apakah punca kebocoran memori javascript?

Apakah punca kebocoran memori javascript?

青灯夜游
Lepaskan: 2021-11-19 16:37:51
asal
4690 orang telah melayarinya

Punca kebocoran memori JavaScript: 1. Penggunaan pembolehubah global yang tidak betul; 3. Kelewatan atau pemasa tidak dikosongkan 4. Rujukan elemen DOM yang tidak dikosongkan; acara tidak dikosongkan apabila dipadamkan).

Apakah punca kebocoran memori javascript?

Persekitaran pengendalian tutorial ini: sistem Windows 7, versi JavaScript 1.8.5, komputer Dell G3.

Kebocoran memori bermakna sekeping memori yang diperuntukkan tidak boleh digunakan atau dikitar semula sehingga proses penyemak imbas tamat. Ini bermakna kerana kecuaian atau ralat, program gagal mengeluarkan memori yang tidak digunakan lagi. Kebocoran memori tidak merujuk kepada kehilangan fizikal memori, tetapi lebih kepada fakta bahawa selepas aplikasi memperuntukkan segmen memori tertentu, disebabkan ralat reka bentuk, ia kehilangan kawalan ke atas segmen memori sebelum ia dikeluarkan, sehingga menyebabkan kerosakan ingatan. Berikut adalah beberapa punca biasa kebocoran ingatan.

1. Pembolehubah global

JavaScript boleh mengendalikan pembolehubah yang tidak diisytiharkan: rujukan kepada pembolehubah yang tidak diisytiharkan mencipta pembolehubah baharu dalam objek global. Dalam konteks penyemak imbas, objek global ialah tetingkap.

function foo(){
  name = '前端曰';
}
// 其实是把name变量挂载在window对象上
function foo(){
  window.name = '前端曰';
}

// 又或者
function foo(){
  this.name = '前端曰';
}
foo() // 其实这里的this就是指向的window对象
Salin selepas log masuk

Dengan cara ini, pembolehubah global yang tidak dijangka dibuat secara tidak sengaja Untuk mengelakkan ralat ini daripada berlaku, tambahkan 'use strict;' di hadapan fail Javascript anda. Ini membolehkan mod penghuraian JavaScript yang lebih ketat yang menghalang global yang tidak dijangka. Atau perhatikan sendiri definisi pembolehubah!

2. Penutupan

Penutupan: Fungsi tanpa nama boleh mengakses pembolehubah dalam skop induk.

var names = (function(){  
    var name = 'js-say';
    return function(){
        console.log(name);
    }
})()
Salin selepas log masuk

Penutupan akan menyebabkan kitaran hayat rujukan objek dipisahkan daripada konteks fungsi semasa Jika penutupan digunakan secara tidak betul, ia boleh membawa kepada rujukan bulat (rujukan bulat), serupa. kepada kebuntuan, yang hanya boleh dielakkan tetapi tidak boleh diselesaikan kemudian, walaupun terdapat kutipan sampah, masih akan berlaku kebocoran memori.

3. Penangguhan/pemasa yang terlupa

Dalam keperluan harian kita, kita mungkin sering mencuba setInterval/setTimeout, tetapi biasanya kita terlupa untuk membersihkannya selepas digunakan.

var someResource = getData(); 
setInterval(function() { 
    var node = document.getElementById('Node'); 
    if(node) { 
        // 处理 node 和 someResource 
        node.innerHTML = JSON.stringify(someResource)); 
    } 
}, 1000);
Salin selepas log masuk

Ini dalam setInterval/setTimeout menghala ke objek tetingkap, jadi pembolehubah yang ditakrifkan secara dalaman juga dipasang secara global jika pembolehubah someResource dirujuk, jika setInterval/setTimeout tidak dikosongkan, someResource juga perlu; untuk melepaskan; perkara yang sama berlaku untuk setTimeout. Jadi kita perlu ingat untuk clearInterval/clearTimeout apabila selesai.

4. Rujukan elemen DOM yang tidak dibersihkan (Apabila dom dikosongkan atau dipadamkan, acara tidak dikosongkan )

var elements = {
    button: document.getElementById('button'),
    image: document.getElementById('image'),
    text: document.getElementById('text')
};
function doStuff() {
    image.src = 'http://some.url/image';
    button.click();
    console.log(text.innerHTML);
}
function removeButton() {
    document.body.removeChild(document.getElementById('button'));
    // 此时,仍旧存在一个全局的 #button 的引用
    // elements 字典。button 元素仍旧在内存中,不能被 GC 回收。
}
Salin selepas log masuk

[Pembelajaran yang disyorkan: Tutorial JavaScript Lanjutan]

Atas ialah kandungan terperinci Apakah punca kebocoran memori javascript?. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!

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