如何彻底销毁JavaScript对象?

如何彻底销毁JavaScript对象?,javascript,destroy,Javascript,Destroy,我正在用node.js开发一个游戏服务器,我希望将匹配存储在队列中,以便能够在某个超时后销毁它们。以下是我的基本实现: var matchs = []; var createMatch = function () { matchs.unshift(new Match()); matchs[0].start(); setTimeout(function () { delete matchs[matchs.length - 1]; matc

我正在用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秒后停止。然而,如果我运行这段代码,它将永远继续显示数字,这使我认为我的匹配对象没有被正确地销毁


请提供帮助?

您可以使用
clearInterval
清除间隔

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

仅仅延迟
匹配
对象不会导致间隔停止,因为它仍在运行。此外,该间隔将通过
self
变量保留对
Match
的引用。

您可以使用
clearInterval
清除间隔

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

仅仅延迟
匹配
对象不会导致间隔停止,因为它仍在运行。此外,该间隔将通过
self
变量保留对
Match
的引用。

delete操作符删除属性,但不会销毁对象或对象创建的任何对象(如间隔)。因此,您的
设置超时实际上可能是:

setTimeout(function () {
    matchs.pop().destroy();
}, 5 * 1000);
pop
从数组中删除元素(不再被引用并且可以被清除),但是需要
destroy()
来明确地告诉
匹配
对象它需要清理东西。在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()

运算符删除属性,但不会销毁对象或对象创建的任何对象(如间隔)。因此,您的
设置超时实际上可能是:

setTimeout(function () {
    matchs.pop().destroy();
}, 5 * 1000);
pop
从数组中删除元素(不再被引用并且可以被清除),但是需要
destroy()
来明确地告诉
匹配
对象它需要清理东西。在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()

对象实际上是一个数组,因此该对象实际上是一个数组,因此如果我理解得很好,该对象不会被销毁,因为它仍然链接到一个区间?当我清理链接到它的每个间隔时,它是否从内存中删除?是的,当在所有范围中取消引用它时,变量将被垃圾收集(具体取决于引擎的实现),因此如果我理解得很好,对象不会被销毁,因为它仍然链接到一个间隔?当我清理链接到它的每个间隔时,它是否从内存中删除?是的,当您在所有范围中取消引用它时,变量将被垃圾收集(具体取决于引擎的实现)好的,这就是我需要知道的:)谢谢!好吧,这就是我需要知道的:)谢谢!