2

它们只是 node.js 官方文档中的几行。

client.on('data', function(data) {
  console.log(data.toString());
  client.end();
});

我认为客户端对象具有对回调的引用,回调具有对客户端对象的闭包引用。那是对的吗?如果是,为什么鼓励这样做?

4

2 回答 2

3

是的,这是一个循环引用,但它不是内存泄漏。仅给出此代码片段,您只有一小部分对象的小图,但是是的,只要client可以从您的主程序访问,所有这些对象将永远不会有资格进行垃圾回收。但是,如果您要设置client = null;,则包括client对象和匿名事件处理函数的对象图将无法从主程序访问,因此有资格进行垃圾收集,因此 A-OK。

这种模式本身并不是内存泄漏。如果您要在循环中创建客户端并将对所有客户端的引用保存在数组或对象中,而没有代码来处理过时的客户端,那么是的,那将是内存泄漏。

于 2013-03-01T14:54:26.097 回答
1

这是对的。node.js 中的事件发射器将其侦听器存储在私有 _listeners 属性中。您的处理程序函数client用作封闭变量,这不是绝对必要的,因为所有处理程序都以事件发射器作为this引用来调用。

但是,使用this而不是client不会改变client闭包中的事实,它只是提示 V8 从闭包中取消引用它,因为它没有被使用。

即使它是从闭包中使用的,V8 也有足够的逻辑来处理这种循环引用并正确地从内存中释放它们。

于 2013-03-01T14:51:51.307 回答