Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/438.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/node.js/37.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
javascript内存泄漏。创建具有socketObject的新对象_Javascript_Node.js_Es6 Class - Fatal编程技术网

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);
}