dro*_*nus 4 javascript garbage-collection event-handling
如果通过创建了图像var img=new Image(),onload则添加并img.src设置了处理程序,onload尽管该图像未附加到DOM树,也将请求并调用该图像数据。例如。
var img=new Image();
img.onload=function(){
alert('Loaded!');
}
img.src='test.png';
Run Code Online (Sandbox Code Playgroud)
何时以及如何垃圾收集该图像?JavaScript是否能够知道该onload处理程序将被调用并且仅被调用一次以释放图像?JavaScript是否会通知if img.src是否未设置,因此onload将永远不会被调用并img可以立即释放?
我使用测试页进行了一些调查,以找到问题的答案-当带有事件处理程序的图像对象(在JS中创建但未附加到DOM树)被垃圾收集时。
页面中的JS代码通过document.createElement("img")(new Image()以相同的方式工作)创建1000个图像,附加2个事件处理程序(加载和错误)并设置src属性。
加载所有图像后,JS尝试释放gc()在上一个加载事件中显式调用的内存(=同步),然后立即src将此图像的设置为另一个URL。另外,将计时器设置为第二次尝试释放内存,因此稍后将以异步方式完成。
Chrome开发人员工具中的“内存时间轴”显示,第一个GC会收集除最后一个GC外的所有图像。我认为这是因为无法加载最后一张图片,因为它正在加载新图片。当发生第二个GC时,最后一个图像已经加载,并且也从内存中将其删除。
我从这个实验中得出的结论是:
已在Chrome Canary 33.0.1733.2中通过--js-flags="--expose-gc"
源代码http://pastebin.com/YZkGYmBC测试
| 归档时间: |
|
| 查看次数: |
502 次 |
| 最近记录: |