Javascript 事件处理程序垃圾收集
Javascript event handler Garbage collection
下面的代码会导致内存泄漏吗?当我从 DOM 中删除 'submitBtn' 时,它会与其事件处理程序一起被垃圾回收吗?
或者在从 DOM 中删除 'submitBtn' 之前是否必须调用 removeEventListener()?
function addEventHandler() {
var btnId3 = document.getElementById("id3");
btnId3.addEventListener(
"click",
function () {
console.log(btnId3.name);
},
false
);
}
addEventHandler();
document.forms[0].lastElementChild.remove();
<!DOCTYPE html>
<html>
<head>
<title>JS GC</title>
</head>
<body>
<form id="id1" method="post">
<input id="id2" type="text" name="username" value="John">
<input id="id3" type="button" name="submitBtn" value="Echo Username">
</form>
</body>
</html>
当所有对它的引用都丢失时,每个值(包括函数和 DOM 对象)都可以进行垃圾回收。如果你删除一个 DOM 节点,它会从 DOM 树中分离出来,因此对它的引用也会被删除。只要没有其他引用(您的代码中没有),该节点就可以进行垃圾回收。因此该函数(如果它仅在节点内部被引用)对于 gc 也是可行的。
下面的代码会导致内存泄漏吗?当我从 DOM 中删除 'submitBtn' 时,它会与其事件处理程序一起被垃圾回收吗? 或者在从 DOM 中删除 'submitBtn' 之前是否必须调用 removeEventListener()?
function addEventHandler() {
var btnId3 = document.getElementById("id3");
btnId3.addEventListener(
"click",
function () {
console.log(btnId3.name);
},
false
);
}
addEventHandler();
document.forms[0].lastElementChild.remove();
<!DOCTYPE html>
<html>
<head>
<title>JS GC</title>
</head>
<body>
<form id="id1" method="post">
<input id="id2" type="text" name="username" value="John">
<input id="id3" type="button" name="submitBtn" value="Echo Username">
</form>
</body>
</html>
当所有对它的引用都丢失时,每个值(包括函数和 DOM 对象)都可以进行垃圾回收。如果你删除一个 DOM 节点,它会从 DOM 树中分离出来,因此对它的引用也会被删除。只要没有其他引用(您的代码中没有),该节点就可以进行垃圾回收。因此该函数(如果它仅在节点内部被引用)对于 gc 也是可行的。