Javascript 非附加映像。onload垃圾回收

Javascript 非附加映像。onload垃圾回收,javascript,event-handling,garbage-collection,Javascript,Event Handling,Garbage Collection,如果通过var img=new image()。例如 var img=new Image(); img.onload=function(){ alert('Loaded!'); } img.src='test.png'; 何时以及如何垃圾收集此映像?JavaScript是否能够知道将调用onload处理程序,并且只调用一次,以便在以后释放图像?如果未设置img.src,JavaScript是否会注意到,因此将永远不会调用onload,并且可以立即释放img 我用a做了一些调查,以找到问

如果通过
var img=new image()。例如

var img=new Image();
img.onload=function(){
    alert('Loaded!');
}
img.src='test.png';

何时以及如何垃圾收集此映像?JavaScript是否能够知道将调用
onload
处理程序,并且只调用一次,以便在以后释放图像?如果未设置
img.src
,JavaScript是否会注意到,因此将永远不会调用
onload
,并且可以立即释放
img

我用a做了一些调查,以找到问题的答案-当带有事件处理程序的图像对象(在JS中创建,未连接到DOM树)被垃圾收集时

页面中的JS代码通过
document.createElement(“img”)
new Image()
的工作方式相同),创建1000个图像,附加2个事件处理程序(加载和错误),并设置
src
属性。
加载所有图像后,JS尝试在上次加载事件(=同步)中显式调用
gc()
释放内存,并立即将此图像的
src
设置为另一个URL。此外,计时器设置为第二次尝试释放内存,因此稍后将以异步方式完成

ChromeDeveloperTools中的内存时间线显示,第一个GC收集除最后一个之外的所有图像。我解释为最后一张图片无法GC'ed,因为它正在加载新图片。 当第二次GC发生时,最后一个映像已经加载,并且它也从内存中删除


我的实验结论是:

  • 如果没有指向映像的链接,则调用加载/错误事件处理程序 对象存在于JS中
  • 图像加载过程完成后(成功或失败),可以对图像对象进行垃圾收集
在Chrome Canary 33.0.1733.2中使用
--js flags=“--expose gc”


源代码

这似乎是一种相当合理的行为。希望其他浏览器也能同样很好地处理这个问题。