Apakah kebocoran memori yang disebabkan oleh penutupan?

百草
Lepaskan: 2023-11-22 14:51:43
asal
1683 orang telah melayarinya

Kebocoran memori yang disebabkan oleh penutupan termasuk: 1. Gelung tak terhingga dan panggilan rekursif; 2. Pembolehubah global dirujuk di dalam penutupan; Pengenalan terperinci: 1. Gelung tak terhingga dan panggilan rekursif Apabila penutupan merujuk kepada pembolehubah luaran secara dalaman, dan penutupan ini berulang kali dipanggil oleh kod luaran, ia mungkin menyebabkan kebocoran memori Ini kerana setiap panggilan akan menyebabkan kebocoran memori memori. Cipta skop baharu dalam skop, dan skop ini tidak akan dibersihkan oleh mekanisme pengumpulan sampah 2. Pembolehubah global dirujuk di dalam penutupan, jika pembolehubah global dirujuk di dalam penutupan, dsb.

Apakah kebocoran memori yang disebabkan oleh penutupan?

Sistem pengendalian tutorial ini: sistem Windows 10, komputer DELL G3.

Penutupan ialah konsep penting dalam JavaScript, yang membenarkan fungsi mempunyai pembolehubah peribadi dan mengakses pembolehubah peribadi ini di luar fungsi. Walau bagaimanapun, jika penutupan digunakan secara tidak betul, ia boleh menyebabkan masalah kebocoran memori. Berikut ialah beberapa situasi biasa kebocoran memori yang disebabkan oleh penutupan:

1 Gelung tak terhingga dan panggilan rekursif: Apabila penutupan merujuk kepada pembolehubah luaran secara dalaman, dan penutupan ini berulang kali dipanggil oleh kod luaran, ia mungkin Menyebabkan kebocoran memori. Ini kerana setiap panggilan mencipta skop baharu dalam ingatan, dan skop ini tidak dibersihkan oleh mekanisme kutipan sampah. Jika penutupan ini tidak membersihkan pembolehubah luaran dengan betul, maka pembolehubah ini akan kekal dalam ingatan sehingga program tamat.

function outerFunction() {  
    var outerVariable = new Array(1000000).fill(0);  
    var innerFunction = function() {  
        // 这里引用了外部变量 outerVariable  
        console.log(outerVariable);  
    }  
    return innerFunction;  
}  
var leakyFunction = outerFunction();  
leakyFunction(); // 这里的调用会创建新的作用域并引用 outerVariable,导致内存泄漏
Salin selepas log masuk

2 Pembolehubah global dirujuk dalam penutupan: Jika pembolehubah global dirujuk di dalam penutupan dan rujukan kepada pembolehubah global tidak dikosongkan pada masa yang sesuai, pembolehubah global akan kekal dalam ingatan sehingga program Selesai.

var globalVariable = new Array(1000000).fill(0);  
var closure = (function() {  
    // 这里引用了全局变量 globalVariable  
    return function() {  
        console.log(globalVariable);  
    }  
})();  
closure(); // 这里的调用会创建新的作用域并引用 globalVariable,导致内存泄漏
Salin selepas log masuk

3 Penutupan secara dalaman merujuk kepada objek yang tidak boleh dibersihkan: Jika penutupan secara dalaman merujuk kepada objek yang tidak boleh dibersihkan (seperti penutupan itu sendiri, fungsi, nod DOM, dll.), maka objek ini akan sentiasa wujud dalam ingatan sehingga. program Selesai.

var leakyObject = { toString: function() { return "leaky"; } };  
var closure = (function() {  
    // 这里引用了不可清理的对象 leakyObject  
    return function() {  
        console.log(leakyObject);  
    }  
})();  
closure(); // 这里的调用会创建新的作用域并引用 leakyObject,导致内存泄漏
Salin selepas log masuk

Untuk mengelakkan kebocoran memori yang disebabkan oleh penutupan, kita perlu memberi perhatian kepada perkara berikut:

Cuba elakkan menggunakan penutupan apabila anda tidak perlu menggunakannya. Sebagai contoh, anda boleh menggunakan kaedah atau kelas statik dan bukannya penutupan.

Apabila menggunakan penutup, cuba elakkan merujuk pembolehubah global atau objek tidak boleh dibersihkan di dalam penutup. Jika rujukan mesti dibuat, rujukan kepadanya hendaklah dibersihkan dengan segera selepas digunakan.

Apabila menggunakan rekursi dan gelung, anda harus memastikan setiap panggilan ditamatkan pada masa yang sesuai untuk mengelakkan kebocoran memori yang disebabkan oleh gelung tak terhingga dan panggilan rekursif.

Atas ialah kandungan terperinci Apakah kebocoran memori yang disebabkan oleh penutupan?. 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