node.js – 为什么匿名callback

我正在学习node.js,并且已经注意到几乎所有的callback函数都被内联为匿名callback函数。 这样做背后有一个具体原因吗?

我认为使用一个有名的callback函数,并将其定义为一个本地函数有两个优点:1.它更干净,不会将函数变成一个巨大的代码块2.给定一个合适的名称,它充当文档 – 描述什么callback是应该做的

在全局范围中使用命名函数作为callback函数时,函数名称的作用域可能会导致该函数在内存中保留并阻止其被垃圾收集。 这是在您的应用程序中导致内存泄漏的很多方法之一。 另一方面,匿名函数在执行结束后会立即标记为GC,并且不会返回的任何内容(也可能是闭包)将被自动标记为垃圾回收。

考虑一个相当复杂的jQuery插件。 在生成并返回作为插件主题的实际对象之前,可能需要创build数十个包含临时状态数据的variables。 如果这不是在IIFE(即时调用的函数expression式:立即执行的匿名函数)中完成的,则这些variables将“泄漏”到全局范围中。 JavaScript中的数据将保留在内存中,只要有一个variables或闭包仍然引用它。 由于这些variables已经“泄漏”到全局范围,它们将一直保留在内存中,直到该标签/窗口closures。 当在IIFE中定义时,定义的variables被卡在本地匿名函数的作用域中。 因此,当函数完成执行时,variables“消失”,其数据不再有任何引用。 JS引擎的垃圾收集器注意到内存中的这些特定数据不再被引用到任何地方,并将其标记为删除,释放其他数据占用的内存。

所以,如果你命名了你的函数,而且你只需要调用它一次,那么他们可能会不必要地占用内存。 使他们匿名将回收执行后的内存,减less您的应用程序的内存开销。

这本质上是对大多数dynamic语言如何工作的描述,以及为什么它们比C这样的静态语言更受欢迎,在这种语言中,您必须跟踪所做的每个内存分配,并确保在不再需要时删除它们他们(一个练习本身;决定你需要一个特定的数据多久并不总是微不足道的)。