javascript内存泄漏。创建具有socketObject的新对象
我有一个接收套接字对象的类似函数javascript内存泄漏。创建具有socketObject的新对象,javascript,node.js,es6-class,Javascript,Node.js,Es6 Class,我有一个接收套接字对象的类似函数 X类{ 构造函数(socketObject,回调){ this.socketObject=socketObject; 回调(null,socketObject); } } const socketObject={hello:'world'}; 新X(socketObject,函数(err,res){ 如果(!err) z(res) }) 函数z(res){ 控制台日志(res); }问题代码已编辑。您的初始代码(但有拼写更正): 不,没有内存泄漏。有两种情况(
X类{
构造函数(socketObject,回调){
this.socketObject=socketObject;
回调(null,socketObject);
}
}
const socketObject={hello:'world'};
新X(socketObject,函数(err,res){
如果(!err)
z(res)
})
函数z(res){
控制台日志(res);
}
问题代码已编辑。您的初始代码(但有拼写更正):
不,没有内存泄漏。有两种情况(实际上是相同的情况):
假设您保留由新X
返回的对象,例如:
var x = new X (socketObject, function (err, res) {
return;
})
…然后只要new x
返回的对象仍被某个对象引用(x
,在上面),那么所引用的对象socketObject
(现在是x.socketObject
)将保留在内存中。当x
超出范围或您为其分配了不同的值时,该对象将符合垃圾收集的条件;如果也没有其他对套接字对象的引用,那么它也是如此。(在您的代码中,还有另一个引用:传递到newx
的socketObject
变量)
如果您不保留由new X
返回的对象,那么它立即可用于垃圾收集,并且,如果没有其他引用,套接字对象也可用于垃圾收集
关于问题中的新准则:
class X {
constructor (socketObject, callback) {
this.socketObject = socketObject;
callback(null, socketObject);
}
}
const socketObject = {hello:'world'};
new X (socketObject, function (err, res) {
if(!err)
z(res)
})
function z(res){
console.log(res);
}
如果
socketObject
const
在某个点超出范围(如果它是全局的,那么在某种意义上会有一个非常小的泄漏,因为没有任何东西可以清除它对套接字对象的引用,因为它是一个常量)。在注释中,您似乎关心函数调用;不要这样,它不会改变任何东西。你真的没有保留由new X(…)
返回的对象吗?拼写在代码中很重要,你拼错了construcor
和sokcetObject
。那为什么要有一个类呢?这不是一个参数。如果您不从其他地方访问该实例,那么与简单的闭包相比,类没有任何好处。(从中提取)…但是有不必要的成本:1。要编写、读取和维护的额外代码。2.创建一个你不需要的对象(虽然这是一个非常非常非常小的成本,通常不值得担心)。请看一看,我更改了代码。现在它将执行另一个功能。我没有“var”@EdwardGizbreht:请不要编辑问题,这样会使发布的答案无效,这是一个非常不可能的问题。我已经更新了答案。谢谢你的回答!
class X {
constructor (socketObject, callback) {
this.socketObject = socketObject;
callback(null, socketObject);
}
}
const socketObject = {hello:'world'};
new X (socketObject, function (err, res) {
if(!err)
z(res)
})
function z(res){
console.log(res);
}