在JavaScript中删除对象的最佳方法是什么?

时间:2013-11-01 09:49:07

标签: javascript oop garbage-collection javascript-objects

在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/

2 个答案:

答案 0 :(得分:3)

通过这样做,你将获得最佳效果

window.obj = null;
delete window.obj;

将对象设置为null将删除对它的任何引用。还要记住,delete命令对常规变量没有影响,只对属性有效。

为了更好地确保对象破坏,您可以考虑根本不使用全局上下文,这通常被视为反模式。

答案 1 :(得分:2)

摆脱对象的唯一方法是让JavaScript对其进行垃圾收集,因此确保没有任何对该对象的引用和祈祷是唯一的方法。

如果您反复创建和销毁同一个对象,请考虑使用object pool