ลืมตัวจับเวลา/โทรกลับ
มีเหตุการณ์เกี่ยวกับเวลาสองเหตุการณ์ในจาวาสคริปต์คือ setTimeout() และ setInterval() อดีตเรียกใช้ฟังก์ชันหลังจากรอตามจำนวนมิลลิวินาทีที่ระบุ ในขณะที่ฟังก์ชันหลังเรียกใช้ฟังก์ชันเป็นระยะ (ซ้ำทุกช่วงเวลา)
เมื่อวัตถุใดๆ เชื่อมโยงกับการเรียกกลับของตัวจับเวลา วัตถุนั้นจะไม่ถูกปล่อยจนกว่าจะหมดเวลา ในสถานการณ์สมมตินี้ ตัวจับเวลาจะรีเซ็ตตัวเองและทำงานตลอดไปจนกว่าจะหมดเวลาโดยไม่อนุญาตให้ตัวรวบรวมขยะนำหน่วยความจำออก ตัวจับเวลาเหล่านี้เป็นสาเหตุที่พบบ่อยที่สุดของหน่วยความจำรั่วในจาวาสคริปต์
ตัวอย่าง
ในตัวอย่างต่อไปนี้ การเรียกกลับของตัวจับเวลาและวัตถุที่ผูกไว้ (tiedObject) จะไม่ถูกปล่อยจนกว่าการหมดเวลาจะเสร็จสิ้น ในระหว่างนี้ ตัวจับเวลาจะรีเซ็ตตัวเองและทำงานตลอดไป ดังนั้น พื้นที่หน่วยความจำของตัวจับเวลาจะไม่ถูกรวบรวมแม้ว่าจะไม่มีการอ้างอิงถึงวัตถุดั้งเดิมก็ตาม
<html> <body> <script> for (var i = 0; i < 100000; i++) { var tiedObject = { callAgain: function() { var text = this; var value = setTimeout(function() { text.callAgain(); }, 100000); } } tiedObject.callAgain(); tiedObject = null; } </script> </body>> </html>
หลีกเลี่ยงหน่วยความจำรั่ว
1. เพื่อหลีกเลี่ยงการรั่วไหล ให้อ้างอิงภายใน setInterval()/setTimeout() ที่ฟังก์ชันต่างๆ จำเป็นต้องดำเนินการก่อนที่จะสามารถรวบรวมขยะได้
2.โทรออกโดยตรงเพื่อลบฟังก์ชันเมื่อไม่ต้องการใช้อีกต่อไป
ยกเว้นเบราว์เซอร์รุ่นเก่า เช่น IE เบราว์เซอร์สมัยใหม่ส่วนใหญ่ เช่น chrome เป็นต้น จะไม่ประสบปัญหาประเภทนี้ ไลบรารีที่สำคัญกว่าเช่น jquery จัดการภายในเพื่อให้แน่ใจว่าจะไม่มีปัญหาการรั่วไหล