Rumah  >  Artikel  >  hujung hadapan web  >  Apakah punca kebocoran memori javascript?

Apakah punca kebocoran memori javascript?

青灯夜游
青灯夜游asal
2021-11-19 16:37:514616semak imbas

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对象

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);
    }
})()

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);

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 回收。
}

[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!

Kenyataan:
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
Artikel sebelumnya:Apakah li dalam htmlArtikel seterusnya:Apakah li dalam html