谷歌浏览器应用程序 - 删除Javascript blobs
google chrome app - Delete Javascript blobs?
我正在花很多时间摆脱这些愚蠢的东西。我有几个 Chrome 应用程序可以处理大量媒体文件;其中一个我能够使用一堆"删除"和一个最终阻止它们在chrome://blob-internals/
中建立的window.URL.revokeObjectURL
,但另一个似乎没有任何帮助。我错过了什么吗?我确切地知道我什么时候完成了该死的事情,但我似乎无能为力。
具体来说,我在这样的块中使用 File 对象:
ref.file(function(f) {
// Do some stuff...
// and now I'm done!
delete f
});
这是我应用程序的实际来源:
https://github.com/pkulak/photo-importer
这是我认为我实际上解决了问题的地方,但谁真正知道:
https://github.com/pkulak/drive-slideshow
这看起来您有内存泄漏。
JavaScript 没有你所说的意义上的"删除",它会在属性和变量成为孤立时进行垃圾回收。delete
运算符就是这样一种实现此目的的方法 - 它从对象中删除属性的定义。
正确使用delete
意味着在属性上使用它,而不是在var
上使用它。它适用于某些变量的原因是全局命名空间中的var
会发生什么(即它们成为window
的属性)。这也意味着您无法delete
参数。
此外,请注意,一旦函数完成调用,如果没有引用保持活动状态,那么它的所有内部都将是GC'd。
接下来,考虑
var o = {};
o.a = [];
o.b = o.a;
delete o.a;
现在o.b
是什么?
`o.b; // []`
即使我们删除了o.a
引用,它仍然指向数组。这意味着数组不会被垃圾回收。
那么这对你意味着什么?
若要删除 Blob,需要销毁对它们的所有引用。
是的,撤销 URI 是其中的一部分,但您还需要在整个代码中删除引用。如果你觉得这很困难,我建议你包装所有的 Blob,这样你至少可以最大限度地减少问题。
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,而是在创建 Blob 时立即使用 new myBlob(blob)
,不保留对 Blob 的其他引用。然后,当你完成 Blob 时,调用myWrappedBlob.dispose();
,它应该会释放它以成为 GC'd。如果确实有必要将 Blob 直接传递给某些东西,我给了它属性myBlob.blob
。
- 为什么不't Javascript对我的输入值进行了一些重新检查
- 创建一个类似链接的按钮,并通过Javascript函数打开一个新的弹出窗口
- 将函数的上下文应用于javascript变量
- 使用php或javascript从facebook相册URL中删除多余的部分
- 正在添加'X'按钮,在文本字段旁边使用javascript
- 如何在JavaScript中将字符串转换为函数引用
- 模糊事件的Javascript测试
- Javascript更改图标
- 如何将HTML id分配给元素,以及如何将JavaScript应用于元素
- 如何使用WCF服务和javascript表单post上传.doc文件
- javascript结合了数组和字典
- 这是什么 ==- javascript 运算符
- 从javascript创建一个列表
- 无法在通过jQuery的ajax加载的页面中执行javascript
- Javascript:selenium Web驱动程序isDisplayed()不工作
- 如何通过ajax刷新JSF填充的javascript变量
- 如何在Javascript中将JSon对象转换为数组
- Javascript生成的表单未提交
- 使用javascript将动态表从一个html页面打印到另一个html页
- 谷歌浏览器应用程序 - 删除Javascript blobs