这看起来像你有内存泄漏。
JavaScript 在您所说的意义上没有“删除”,它会在属性和变量成为孤立对象时进行垃圾收集。 delete 操作符是实现这一目标的一种方式 - 它从 Object 中删除属性的定义。
正确使用delete 意味着在属性上使用它,而不是variable。它适用于某些变量的原因是因为var 在全局命名空间中发生了什么(即它们成为window 的属性)。这也意味着你不能delete 一个参数。
此外,请注意,一旦函数完成调用,如果没有保持活动的引用,那么它的所有内部都将被 GC。
接下来,考虑
var o = {};
o.a = [];
o.b = o.a;
delete o.a;
o.b 现在是什么?
`o.b; // []`
即使我们删除了 o.a 引用,它仍然指向 Array。这意味着 Array 不会被垃圾回收。
那么这对你意味着什么?
要摆脱您的Blob,您需要销毁对它们的所有引用。
是的,撤销 URI 是其中的一部分,但您还需要在整个代码中一直删除引用。如果您觉得这很困难,我建议您将所有 Blobs 包装起来,这样至少可以将问题降到最低。
var myBlob = (function () {
var key, o;
function myBlob(blob) {
var url;
this.blob = blob;
blob = null;
this.getURL = function () {
if (url) return url;
return url = URL.createObjectURL(this.blob);
};
this.dispose = function () {
if (url) url = URL.revokeObjectURL(url), undefined;
this.blob = null;
};
}
o = new Blob();
for (key in o)
(function (key) {
Object.defineProperty(myBlob.prototype, key, {
enumerable: true,
configurable: true,
get: function () {return this.blob[key];}
});
}(key));
o = key = undefined;
return myBlob;
}());
现在,在创建 blob 时立即使用new myBlob(blob),而不是使用常规的 Blob 创建,不保留对 blob 的其他引用。然后,当您完成Blob 后,调用myWrappedBlob.dispose();,它应该将其释放以进行GC。如果 真的 有必要将 Blob 直接传递给某个东西,我给它属性myBlob.blob。