带有“onload”事件的JavaScript对象/回调生存期

带有“onload”事件的JavaScript对象/回调生存期,javascript,garbage-collection,closures,Javascript,Garbage Collection,Closures,今晚我正在编写一个图像库,这让我想到了一个哲学问题 我创建了一个预加载的图像对象,并为其设置了一个onload事件 ... onmouseover = function() { preloadActive = true; imgPreload = new Image(); imgPreload.onload = function() { preloadActive = false; }

今晚我正在编写一个图像库,这让我想到了一个哲学问题

我创建了一个预加载的图像对象,并为其设置了一个onload事件

  ...  onmouseover = function() {
        preloadActive = true;
        imgPreload = new Image();

        imgPreload.onload = function() {
            preloadActive = false;
        }

        imgPreload.src = ...;
      }
其中
imgPreload
preload-active
是全局变量

现在想象一下,一个新的
onmouseover()
在执行
onload()之前触发

运行一行代码,创建一个新的图像对象,旧的图像对象松开最后一个链接,转到Erebus,并等待垃圾收集器吃掉它

问题是: 旧对象实例不会立即销毁。它的onload事件持续存在了多长时间没有人知道?你有跨浏览器的经验吗

谢谢大家!

附言:我不担心IE6


PPS:如果我有一个内有setIntervaltimeout ID的对象,会发生什么

obj.someVar = setInterval(...)
setInterval是否在我执行时停止

obj = {}

首先,全局变量不适合进行垃圾收集(这通常是内存泄漏问题的原因,也是避免同时使用全局变量的众多原因之一)


话虽如此,请阅读Eric Lippert的文章。它很旧,但我仍然认为它非常相关。

虽然我可能弄错了,但您不应该在onload事件中执行类似onmouseover的DOM相关代码吗?这样做可以防止出现任何问题。不管怎样,这仍然是一个好问题。-1,只是为了回到一个糟糕的标题。(浏览器)JavaScript中没有“并行线程”这样的东西(可以访问相同的对象——Web工作者是不同的)。事件是异步和阻塞的。此外,此问题与GC无关,仅与对象生存期有关,如果有事件(
onload
)将阻止对象无法访问。@Moses:是否要使用某种机制来防止重新分配imgPreload变量?“if(preload active)return;”但是,我们应该找到垃圾收集器行为良好的链接好的,我在“slideshow”对象中定义了这两个变量。您是否阅读了第一段,其中我说文章不再相关?@Eric如果您对引用旧文章有问题,那么您可能应该删除它。每个关注此链接的人都会看到您宝贵的第一段。问题是什么?我只是觉得奇怪,当它开始指出它已经过时了,你认为它仍然是相关的。JScript垃圾收集器不再像我在2003年描述的那样。你为什么认为这篇文章与这个问题有关?@Eric也许“相关”这个词用错了。我应该称之为“有趣”。