องค์ประกอบ Dom ที่แยกออกมา
องค์ประกอบ DOM ที่แยกออกมาเป็นองค์ประกอบที่ถูกลบออกจาก DOM แล้ว แต่หน่วยความจำยังคงอยู่เนื่องจาก JavaScript ซึ่งหมายความว่าตราบใดที่องค์ประกอบมีการอ้างอิงถึงตัวแปรหรืออ็อบเจ็กต์ใดๆ ก็ตาม จะไม่เก็บขยะแม้หลังจากถูกทำลายจาก DOM แล้ว
DOM เป็นเหมือนต้นไม้ที่มีการเชื่อมโยงสองทาง ซึ่งหมายความว่าการอ้างอิงไปยังโหนดในต้นไม้จะหยุดต้นไม้ทั้งหมดจากการรวบรวมขยะ
มาดูตัวอย่างการสร้างองค์ประกอบ DOM ในจาวาสคริปต์ หลังจากสร้างองค์ประกอบแล้ว ให้ทำลายมัน แต่ลืมลบตัวแปรที่ถือไว้ ภาพจำลองนี้นำไปสู่ Detached DOM ซึ่งไม่เพียงแต่อ้างอิงไปยังองค์ประกอบ DOM เท่านั้น แต่ยังรวมถึงโครงสร้างทั้งหมดด้วย
ตัวอย่าง
ในตัวอย่างต่อไปนี้ แม้ว่าจะถูกลบออกจาก DOM แล้ว 'someText' จะยังคงมีการอ้างอิงในอ็อบเจ็กต์ 'value' ส่วนกลาง นี่คือสาเหตุที่ไม่สามารถลบออกจากตัวรวบรวมขยะและใช้หน่วยความจำต่อไปได้ ซึ่งทำให้หน่วยความจำรั่ว
<html>
<body>
<script>
var example = document.createElement("p");
example.id = "someText";
document.body.appendChild(example);
var value = {
text: document.getElementById('someText')
};
function createFun() {
value.text.innerHTML = "Javascript is not Java";
}
createFun();
function deleteFun() {
document.body.removeChild(document.getElementById('someText'));
}
deleteFun();
</script>
</body>
</html> หลีกเลี่ยงหน่วยความจำรั่ว
เพื่อหลีกเลี่ยงการรั่วไหลของหน่วยความจำ แนวปฏิบัติที่ดีที่สุดคือใส่ตัวอย่าง var ไว้ในตัวฟัง ซึ่งทำให้เป็นตัวแปรในเครื่อง เมื่อตัวอย่าง var ถูกลบ พาธสำหรับอ็อบเจ็กต์จะถูกตัดออก ทำให้ตัวรวบรวมขยะปล่อยหน่วยความจำ