在DOM和JS对象的循环引用中想要了解Javascript中的内存泄漏,认为以下isOnloadCalled()
不会产生"是",但它确实。为什么呢?
function isOnloadCalled() {
var img = new Image();
img.onload = function () {
console.log("yes");
};
img.src = "data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAEAAAABCAIAAACQd1PeAAAAAXNSR0IArs4c6QAAAAlwSFlzAAALEwAACxMBAJqcGAAAAAxJREFUCNdj+P//PwAF/gL+3MxZ5wAAAABJRU5ErkJggg==";
}
isOnloadCalled();
// yields: "yes"
因为我的困惑与DOM对象img
是在isOnloadCalled()
的函数范围内创建并且闭包也在其img.onload
处理程序中的想法有关。我希望img
一旦变得无法访问就会收集垃圾,因此它的onload
处理程序从未被触发。
由于Chrome和Firefox中的测试显示结果是意外的"是",并且对象没有被垃圾收集,我在这个问题中寻找一个答案,详细说明为什么DOM.object的处理程序是在确实DOM已经丢失了所有可到达的引用并且应该被垃圾收集时调用,甚至更多,因为它从未附加到文档DOM树。
因为在任何事件处理程序可以被调用之前,就有Javascript" Run-to-completion"浏览器检查img
的范例和时间不再被引用,可以删除,这样就可以调用onload处理程序。
我唯一提出的问题可能是答案的一部分,即isOnloadCalled()
最后一行是img.src = "[url]"
,现有的img
是"保持可达"通过其引用从javascript消息队列中引用它的事件。但我不确定这是否是正确的解释。