【问题标题】:What is the best way to delete an object in JavaScript?在 JavaScript 中删除对象的最佳方法是什么?
【发布时间】:2026-01-26 03:55:01
【问题描述】:

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

【问题讨论】:

标签: javascript oop garbage-collection javascript-objects


【解决方案1】:

这样做效果最好

window.obj = null;
delete window.obj;

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

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

【讨论】:

  • 谢谢。一个问题:先将window.obj 设置为null 有什么好处?
【解决方案2】:

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

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

【讨论】:

  • 谢谢这是一个非常有趣的链接。
最近更新 更多