如何彻底销毁一个 JavaScript 对象?

How to completely destroy a JavaScript object?

我正在使用 node.js 开发一个游戏服务器,我想将匹配项存储在一个队列中,以便能够在一定的超时后销毁它们。这基本上是我的实现:

var matchs = [];

var createMatch = function () {
    matchs.unshift(new Match());
    matchs[0].start();

    setTimeout(function () {
        delete matchs[matchs.length - 1];
        matchs.pop();
    }, 5 * 1000);
};

function Match() {

    // ...

    this.foo = 0;

    this.start = function () {
        var self = this;

        setInterval(function () {
            console.log(self.foo++);
        }, 1 * 1000);
    };
}

这段代码应该做的是,当我调用 createMatch() 时,每秒显示一个递增的数字,并在 5 秒后停止。但是,如果我 运行 这段代码,它将永远继续显示数字,这让我认为我的 Match 对象没有被正确销毁。

请帮忙?

您可以使用clearInterval清理间隔。

var handle = setInterval(..);
clearInterval(handle);

简单地引用 Match 对象不会导致间隔停止,因为它仍然是 运行。此外,该间隔将通过 self 变量保留对 Match 的引用。

delete 运算符删除 属性 但不会销毁对象或对象创建的任何内容(如间隔)。所以你的 setTimeout 实际上可能是:

setTimeout(function () {
    matchs.pop().destroy();
}, 5 * 1000);

pop 从数组中删除元素(不再被引用并且可以被清理)但是 destroy() 需要明确告诉 Match 对象它需要清理事情了。在 Javascript 中,当对象 确实 从内存中删除时,无法执行某些操作。没有这个概念。

所以你的 Match 对象负责跟踪它需要清理的东西,如下例所示:

    function Match() {
    this.intervalId = undefined;

    this.start = function () {
        ...
        this.intervalId = setInterval(function () {
            ...
        }, 1 * 1000);
    };

    this.destroy = function() {
        if (intervalId)  {
            clearInterval(this.intervalId);
        }
    }
}

超时和间隔是一种资源,可以通过适当的函数销毁。在这种情况下 clearInterval().