带有“onload”事件的JavaScript对象/回调生存期
今晚我正在编写一个图像库,这让我想到了一个哲学问题 我创建了一个预加载的图像对象,并为其设置了一个onload事件带有“onload”事件的JavaScript对象/回调生存期,javascript,garbage-collection,closures,Javascript,Garbage Collection,Closures,今晚我正在编写一个图像库,这让我想到了一个哲学问题 我创建了一个预加载的图像对象,并为其设置了一个onload事件 ... onmouseover = function() { preloadActive = true; imgPreload = new Image(); imgPreload.onload = function() { preloadActive = false; }
... 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也许“相关”这个词用错了。我应该称之为“有趣”。