这看起来像你有内存泄漏。
JavaScript没有您所说的意义上的“删除”,它会随着属性和变量变得孤立而进行垃圾收集。这delete运算符就是实现这一目标的一种方法 - 它从属性中删除属性的定义Object.
Using delete
正确意味着在财产上使用它,而不是在var
可以。它对某些变量起作用的原因是因为发生的情况var
在全局命名空间中(即它们成为window
)。这也意味着你不能delete
一个参数。
此外,请注意,一旦函数完成调用,如果没有引用保持活动状态,则其所有内部都将被 GC 回收。
接下来,考虑
var o = {};
o.a = [];
o.b = o.a;
delete o.a;
What is o.b
now?
`o.b; // []`
它仍然指向Array即使我们删除了o.a
参考。这意味着Array won't被垃圾收集。
所以这对于你来说意味着什么?
为了摆脱你的Blobs,您需要销毁对它们的所有引用。
是的,撤销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, call myWrappedBlob.dispose();
并且它应该将其释放以进行GC。如果它是really需要通过Blob直接变成某物,我给了它属性myBlob.blob
.