لقد قمت بتعديل مثال شخص آخر وأعتقد أنه أكثر إحكاما مثل هذا! لإعادة صياغة كلمات الآخرين، عندما يحتوي كائن DOM على مرجع إلى كائن Js (مثل معالج الأحداث)، ويحتفظ كائن Js هذا بمرجع إلى كائن DOM، يكون المرجع الدائري كافيًا، أي حدث تسرب للذاكرة . انقر فوق "تشغيل التعليمات البرمجية" وافتح "إدارة المهام" لرؤية تغييرات الذاكرة. تم اختباره تحت IE8 وFF على التوالي، وغني عن القول الفرق.
تشغيل الكود
انسخ رمز الكود كما يلي:
<أتش تي أم أل>
<الرأس>
<title>تسرب الذاكرة</title>
<نمط>
جسم{
الحشو: 10 بكسل؛
}
</نمط>
</الرأس>
<الجسم>
</الجسم>
<النص البرمجي>
فار س = [];
فار ن = 0;
setInterval(وظيفة(){
q.push(makeSpan());
إذا (ف. الطول> = 10) {
var s = q.shift();
إذا (ق) {
s.parentNode.removeChild(s);
}
}
ن++;
},10);
وظيفة ميك سبان () {
var s = document.createElement("span");
document.body.appendChild(s);
var t=document.createTextNode("*** " + n + " ***");
s.appendChild(t);
s.onclick=function(e){
s.style.backgroundColor="red";
تنبيه (ن)؛
};
العودة ق.
};
</script>
</html>
فكيف يمكن حلها تحت أي؟
عند حذف عقدة، قم بكسر المرجع الدائري يدويًا وقم بتغيير رمز setInterval بداخله قليلاً كما يلي:
انسخ رمز الكود كما يلي:
setInterval(وظيفة(){
q.push(makeSpan());
إذا (ف. الطول> = 10) {
var s = q.shift();
إذا (ق) {
s.onclick = null;//المفتاح هنا
s.parentNode.removeChild(s);
}
}
ن++;
},10);