如何彻底销毁JavaScript对象?

时间:2015-06-15 13:49:13

标签: javascript destroy

我正在使用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对象没有被正确销毁。

请帮忙吗?

2 个答案:

答案 0 :(得分:3)

您可以使用clearInterval清除间隔。

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

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

答案 1 :(得分:2)

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()