如何彻底销毁一个 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()
.
我正在使用 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()
.