new Image().src =url; 这行代码的Image对象什么时候被释放?
发布于 11 天前 作者 jinkankakushoujo 435 次浏览 来自 问答

new Image().src =url; 这行代码中创建的Image对象没有被任何一个变量代入,那么其还会不会加载图片?如果会加载图片,那么onload回调会不会百分百执行? 由于这图片可能要加载一段时间才能够加载完成,那么这段时间里这对象不会被GC释放掉吗?

9 回复

虽然尚未挂到DOM树上,但我记得好像会加载图片的

@waitingsong 加载完图片后会一直驻留在内存里吗?还是说加载好图片就会被释放?

离开作用于之后,就会在下一次 gc 中被释放。目前 chrome 的 devtools 已经可以跨边界跟踪 dom 对象和 js 对象了 https://zhuanlan.zhihu.com/p/34272169

可以使用 devtools 工具查看一下

@jinkankakushoujo 跟引用有关,如果你创建的对象,没有引用保持它的话,自然会在下次 GC 的时候回收掉。

@justjavac 那如果有onload,是不是可能不会被回调?不过如果代入onload貌似会有闭包,当然如果没有调用那个外部函数里的局部变量的话,貌似就没闭包?

@atian25 那如果下次GC的时候这个图片还没加载完毕,也会被中途取消加载吗?如果有onload也不会被回调?

@jinkankakushoujo 你对 Image 理解有误,Image 并不是 V8 中原生的 js 对象,而是由 blink 渲染引擎负责的 C++ 对象,两者之间通过 V8 Binding 关联

具体细节可以看看 “V8 Binding Explained” 的 “How to tell the reachability to V8” 章节。

再说说 load,即使没有绑定 load 事件,那么在图片加载的整个过程中,这个 DOM Object 是的,不会被回收。同理你可以类比一下 ajax 请求时的 xhr 对象。

@justjavac 原来如此,也就是说只有等图片加载完毕之后才会被GC回收,所以不用担心之前就释放或内存不释放。

回到顶部