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

การอ้างอิงแบบวงกลมจะทำให้หน่วยความจำรั่วไหลใน JavaScript ได้อย่างไร


การอ้างอิงแบบวงกลม

การอ้างอิงแบบวงกลมจะเกิดขึ้นเมื่อมีตัวแปรสองตัวที่อ้างอิงถึงกันโดยให้แต่ละอ็อบเจ็กต์มีการอ้างอิงถึง 1. ในระบบที่รวบรวมขยะมูลฝอย การอ้างอิงแบบวงกลมอาจไม่มีปัญหาเมื่อตัวแปรที่เกี่ยวข้องไม่มีการอ้างอิง ในสถานการณ์นั้น ตัวแปรที่ประกาศจะถูกรวบรวมเป็นขยะ ในระบบการนับอ้างอิง วัตถุจะไม่ถูกทำลายเพราะจำนวนอ้างอิงไม่สามารถเป็นศูนย์ได้

ในระบบไฮบริด ซึ่งใช้การนับอ้างอิงและการรวบรวมขยะ หน่วยความจำรั่วจะเกิดขึ้นเนื่องจากระบบไม่สามารถระบุการอ้างอิงแบบวงกลมได้

ตัวอย่าง

ตัวอย่างต่อไปนี้แสดงการอ้างอิงแบบวงกลมระหว่างวัตถุ javascript และวัตถุ DOM วัตถุ javascript มีการอ้างถึงวัตถุ DOM (Div) และวัตถุ Dom (Div) ผ่านคุณสมบัติ "ขยาย" มีการอ้างอิงถึงวัตถุ javascript (obj) เนื่องจากวัตถุทั้งสองมีการอ้างอิงถึงกัน จึงไม่มีใครสามารถทำลายได้โดยการทำให้หน่วยความจำรั่ว

<html>
<body>
<script>  
   window.onload = function(){
   var obj=document.getElementById("DivElement");
   document.getElementById("DivElement").expandoProperty=obj;
   obj.String=new Array(1000).join(new Array(2000);
   };
</script>
</body>
</html>

หลีกเลี่ยงหน่วยความจำรั่ว

ในตัวอย่างต่อไปนี้ในขั้นต้น ทั้งวัตถุจาวาสคริปต์และวัตถุ DOM อยู่ในการอ้างอิงแบบวงกลม แต่เมื่อกำหนด null ให้กับวัตถุจาวาสคริปต์ ทั้งวัตถุ (วัตถุจาวาสคริปต์และ DOM) จะมีปัญหาในการหาว่าใครกำลังอ้างอิงนั่นคือวัตถุจาวาสคริปต์กำลังอ้างอิงหรือไม่ null หรือวัตถุ DOM ที่นั่นโดยการทำลายการอ้างอิงแบบวงกลม

ตัวอย่าง

<html>
<body>
<script>  
   window.onload = function(){
   var obj=document.getElementById("DivElement");
   document.getElementById("DivElement").expandoProperty=obj;
   obj.String=new Array(1000).join(new Array(2000);
   obj = null        // this breaks circular reference
   };
</script>
</body>
</html>