这个nodejs代码是循环引用吗?

时间:2013-03-01 14:26:38

标签: javascript node.js memory-leaks closures

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

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

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

2 个答案:

答案 0 :(得分:2)

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

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

答案 1 :(得分:1)

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

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

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