在JavaScript中,我有包含函数,变量和闭包的复杂对象。
这些物体非常大,非常复杂,一次又一次地被创造和摧毁。我将处理一个功耗非常低,内存非常低的设备,所以当删除对象时它们真的不见了,这对我很重要。
这是一个代码示例:
window["obj"] = {};
obj.fun1 = function(){
console.log(1);
};
(function(){
var n = 2;
function fun(){
console.log(n);
}
obj.fun2 = fun;
})();
(function(){
var w = "Three";
function fun(){
console.log(w);
}
obj.fun3 = fun;
})();
(function(){
var w = "f.o.u.r.";
function fun(){
setInterval(function(){
console.log(w);
}, 1e3); // e.g. a timeout
}
obj.fun4 = fun;
})();
obj.fun1();
obj.fun2();
obj.fun3();
obj.fun4();
var fun2 = obj.fun2;
// window.obj = null;
// window.obj = undefined;
delete window.obj;
console.log(typeof obj); // undefined
第二个问题是“延迟引用”的问题,例如:
fun2(); // 2
// Interval: "f.o.u.r.", "f.o.u.r.", "f.o.u.r.", "f.o.u.r." ...
有没有什么可以做的(除了在删除对象之前手动清理)?
上面代码的JSFiddle在这里:http://jsfiddle.net/8nE2f/
答案 0 :(得分:3)
通过这样做,你将获得最佳效果
window.obj = null;
delete window.obj;
将对象设置为null将删除对它的任何引用。还要记住,delete命令对常规变量没有影响,只对属性有效。
为了更好地确保对象破坏,您可以考虑根本不使用全局上下文,这通常被视为反模式。
答案 1 :(得分:2)
摆脱对象的唯一方法是让JavaScript对其进行垃圾收集,因此确保没有任何对该对象的引用和祈祷是唯一的方法。
如果您反复创建和销毁同一个对象,请考虑使用object pool。