Computer >> คอมพิวเตอร์ >  >> การเขียนโปรแกรม >> Javascript

ตัวจับเวลาหรือการโทรกลับที่ถูกลืมจะทำให้หน่วยความจำรั่วใน JavaScript ได้อย่างไร


ลืมตัวจับเวลา/โทรกลับ

มีเหตุการณ์เกี่ยวกับเวลาสองเหตุการณ์ในจาวาสคริปต์คือ 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 จัดการภายในเพื่อให้แน่ใจว่าจะไม่มีปัญหาการรั่วไหล