我使用 createElement 方法创建元素,并将其附加到某个父元素。后来,我清除了父元素的innerHTML。这会导致内存泄漏吗?创建的元素会发生什么?如果这是内存泄漏,如何处理?此外,如果元素附加了任何回调函数,是否需要将其分离?
var spanelem = document.createElement('span');
spanelem.onclick = function(){
CallMe();
};
var parentdiv = document.getElementById('ParentCnt');
parentdiv.appendChild(spanelem);
.....
.....
parentdiv.innerHTML = " "; //is this memory Leak ? what happens to spanelem?
最佳答案
这取决于。
如果你有你提供的代码 - spanElem 仍然存在于内存中(如果 var spanelem
在全局范围内,并且你没有执行 spanelem = null
),因为存在对对象的可访问引用。
否则,如果 spanElem 有来自它的 onClick 处理程序的唯一引用 - 它只会在 IE8- 中发生内存泄漏。所有现代浏览器都会处理这种情况并清理垃圾收集内存。
我想你的意思不是相同的代码,而是原则——在这种情况下,你可以检查是否有其他处理程序在它们的词法环境中链接到 spanElem,如果是这样——你可以通过添加来清除引用spanelem = null;
后parentdiv.appendChild(spanelem);
检查 more details at MDN
附言
如果你运行下一个代码
var spanelem = document.createElement('span');
spanelem.onclick = function(){
CallMe();
};
var parentdiv = document.getElementById('ParentCnt');
parentdiv.appendChild(spanelem);
parentdiv.innerHTML = '';
console.log(spanelem);
你会发现 spanelem 仍然存在(它会是一样的,如果你运行
setTimeout(function(){ console.log(spanelem); }, 9999); // some huge delay here
) - 但唯一的原因是,对于下面的代码,我们保存了对 spanelem 对象的引用,因此 gc 不会删除对象。如果我们不使用它 - gc 将删除它正在运行的对象关于javascript - [Javascript] : Does Elements created using CreateElement method, 导致内存泄漏,如果没有正确删除?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/37508417/