new Image().src =url; 这行代码中创建的Image对象没有被任何一个变量代入,那么其还会不会加载图片?如果会加载图片,那么onload回调会不会百分百执行? 由于这图片可能要加载一段时间才能够加载完成,那么这段时间里这对象不会被GC释放掉吗?
虽然尚未挂到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回收,所以不用担心之前就释放或内存不释放。
@jinkankakushoujo 完全不用担心