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.
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,导致内存泄漏
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,导致内存泄漏
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,导致内存泄漏
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!