为什么要调用这个img.onload处理程序?

时间:2016-01-31 13:24:55

标签: javascript dom garbage-collection message-queue

在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消息队列中引用它的事件。但我不确定这是否是正确的解释。

0 个答案:

没有答案