ฉันแก้ไขตัวอย่างของคนอื่นและฉันคิดว่ามันกระชับกว่านี้! ในการถอดความคำพูดของผู้อื่น เมื่อวัตถุ DOM มีการอ้างอิงถึงวัตถุ Js (เช่น ตัวจัดการเหตุการณ์) และวัตถุ Js นี้เก็บการอ้างอิงไปยังวัตถุ DOM การอ้างอิงแบบวงกลมก็เพียงพอแล้ว ดังนั้นภายใต้ เช่น มีหน่วยความจำรั่วเกิดขึ้น . คลิก "เรียกใช้โค้ด" และเปิดตัวจัดการงานเพื่อดูการเปลี่ยนแปลงหน่วยความจำ ทดสอบภายใต้ ie8 และ ff ตามลำดับ ไม่จำเป็นต้องพูดถึงความแตกต่าง
เรียกใช้โค้ด
คัดลอกรหัสรหัสดังต่อไปนี้:
<html>
<หัว>
<title>หน่วยความจำรั่ว</title>
<สไตล์>
ร่างกาย{
ช่องว่างภายใน: 10px;
-
</สไตล์>
</หัว>
<ร่างกาย>
</ร่างกาย>
<สคริปต์>
วาร์ คิว = [];
วาร์ n = 0;
setInterval(ฟังก์ชัน(){
q.push(makeSpan());
ถ้า(q.ความยาว>=10){
var s = q.shift();
ถ้า(s){
s.parentNode.removeChild (s);
-
-
n++;
},10);
ฟังก์ชัน makeSpan(){
var s = document.createElement("ช่วง");
document.body.appendChild (s);
var t=document.createTextNode("*** " + n + " ***");
s.ผนวกเด็ก(t);
s.onclick=function(e){
s.style.พื้นหลังสี = "สีแดง";
การแจ้งเตือน (n);
-
กลับ;
-
</สคริปต์>
</html>
แล้วจะแก้ไขอย่างไรภายใต้เช่น?
เมื่อลบโหนด ให้ทำลายการอ้างอิงแบบวงกลมด้วยตนเอง และเปลี่ยนโค้ด setInterval ภายในเล็กน้อยดังนี้:
คัดลอกรหัสรหัสดังต่อไปนี้:
setInterval(ฟังก์ชัน(){
q.push(makeSpan());
ถ้า(q.ความยาว>=10){
var s = q.shift();
ถ้า(s){
s.onclick = null;//กุญแจอยู่ที่นี่
s.parentNode.removeChild (s);
-
-
n++;
},10);