如何彻底销毁JavaScript对象?
我正在用node.js开发一个游戏服务器,我希望将匹配存储在队列中,以便能够在某个超时后销毁它们。以下是我的基本实现:如何彻底销毁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
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()
对象实际上是一个数组,因此该对象实际上是一个数组,因此如果我理解得很好,该对象不会被销毁,因为它仍然链接到一个区间?当我清理链接到它的每个间隔时,它是否从内存中删除?是的,当在所有范围中取消引用它时,变量将被垃圾收集(具体取决于引擎的实现),因此如果我理解得很好,对象不会被销毁,因为它仍然链接到一个间隔?当我清理链接到它的每个间隔时,它是否从内存中删除?是的,当您在所有范围中取消引用它时,变量将被垃圾收集(具体取决于引擎的实现)好的,这就是我需要知道的:)谢谢!好吧,这就是我需要知道的:)谢谢!