JavaScript为什么需要撤销window.URL.createObjectURL?

时间:2016-06-14 13:36:32

标签: javascript url garbage-collection window revokeobjecturl

function f() {
   // some code.. then:
   var bloburl = URL.createObjectURL(canvasToBlobOutput)
   // I could would do the following line, but assume I don't
   // imgElement.src = bloburl;
   // will this leak memory?
 }

如果我要取消注释imgElement.src行,我明白img元素会" hook"内存中的blob对象。但是如果我们像这样运行函数(没有这一行),我没有看到bloburl无法进行GC的原因?因为我们在函数之后没有引用它。

1 个答案:

答案 0 :(得分:1)

字符串不能充当blob的GC边缘,因为可以操纵字符串。因此,必须将blob放入内部注册表,以防止它被GCed,因此可以从生成的blob URI加载它。

想象一下隐藏的Map实例和URL.createObjectURL实现为:

function createObjectURL(blob) {
   let uri = generateRandomURI()
   window._hiddenMap.set(uri, blob)
   return uri
}

这样,当有人试图加载该URI时,可以检查内部地图。但是该映射还必须保持blob活着,因为URI可能是该blob的唯一剩余引用。

要删除该gc-edge,您必须撤消URI。