3

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

4

2 回答 2

4

这样做你会得到最好的效果

window.obj = null;
delete window.obj;

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

为了更好地确保对象销毁,您可以考虑根本不使用全局上下文,这通常被认为是一种反模式。

于 2013-11-01T09:53:35.817 回答
2

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

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

于 2013-11-01T09:55:51.060 回答