我正在学习node.js,并注意到几乎所有的回调都被内联为函数的匿名回调.以这种方式做事背后有什么特定原因吗?
我认为使用命名回调,并将其定义为本地函数有两个优点:
1.它更干净,并且不会将功能变成一个巨大的代码块
2.给出一个合适的名称,它作为文档 – 描述回调应该做什么
解决方法
在全局作用域中使用命名函数作为回调时,命名函数的作用域可能会导致函数在内存中持久存在并阻止其被垃圾回收.这是导致应用程序内存泄漏的众多方法之一.另一方面,匿名函数在执行结束后立即标记为GC,并且任何未返回的内容(也可能是一个闭包)将被自动标记为垃圾收集.
考虑一个相当复杂的jQuery插件.在生成并返回作为插件主题的实际对象之前,可能必须创建许多保存临时状态数据的变量.如果没有在IIFE中完成(立即调用的函数表达式:立即执行的匿名函数),这些变量将“泄漏”到全局范围内.只要有任何一个变量或闭包仍然引用它,JavaScript中的数据将保留在内存中.由于这些变量已“泄漏”到全局范围,因此它们将保留在内存中,直到该选项卡/窗口关闭.在IIFE中定义时,定义的变量会卡在本地匿名函数的作用域中.因此,当函数完成执行时,变量“消失”并且它们的数据不再具有任何引用. JS Engine的垃圾收集器注意到内存中的这些特定数据不再被引用,并将其标记为删除,从而为其他数据释放占用的内存.
所以如果你命名你的函数并且你只调用它们一次,它们可能会不必要地占用内存.使它们匿名将在执行后回收内存,从而减少应用程序的内存开销.
这基本上是对大多数动态语言如何工作的描述,以及为什么它们比C等静态语言更受欢迎,你必须跟踪你所做的每一个内存分配,并确保在不再需要时删除它们他们(一个练习本身;决定你需要多长时间才能获得特定数据并不总是微不足道).