Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/437.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 node.js-为什么匿名回调_Javascript_Node.js_Callback - Fatal编程技术网

Javascript node.js-为什么匿名回调

Javascript node.js-为什么匿名回调,javascript,node.js,callback,Javascript,Node.js,Callback,我正在学习node.js,并注意到几乎所有回调都作为匿名回调内联到函数中。这样做有什么具体的原因吗 我认为使用命名回调并将其定义为本地函数有两个优点: 1.它更干净,并且不会将函数变成一个巨大的代码块 2.给定一个适当的名称,它将充当文档-描述回调应该做什么当使用全局范围中的命名函数作为回调时,函数命名的范围可能会导致函数在内存中持久化,并防止它被垃圾收集。这是导致应用程序内存泄漏的众多方法之一。另一方面,匿名函数在执行结束后立即标记为GC,任何未返回的(也可能是闭包)都将自动标记为垃圾收集 考

我正在学习node.js,并注意到几乎所有回调都作为匿名回调内联到函数中。这样做有什么具体的原因吗

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

当使用全局范围中的命名函数作为回调时,函数命名的范围可能会导致函数在内存中持久化,并防止它被垃圾收集。这是导致应用程序内存泄漏的众多方法之一。另一方面,匿名函数在执行结束后立即标记为GC,任何未返回的(也可能是闭包)都将自动标记为垃圾收集

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

因此,如果您命名了函数,并且只调用了一次,那么它们可能会不必要地占用内存。使它们匿名将在执行后回收内存,减少应用程序的内存开销


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

这种轮询讨论问题更适合;-)这是一个特定实现的怪癖还是一般行为的怪癖?如果是后者,您能提供一个源代码还是一个具体的示例?这是垃圾收集动态语言的一个基本特性/问题。不仅仅是javascript,还有其他几种语言支持匿名函数(Scala、Haskell、Ruby的lambda块等)。我将扩展这个答案,以包括一个通用jquery模块的示例,因为它比nodejs模块更容易可视化由于使用了命名函数而存在漏洞,但您的编辑似乎关注全局变量的存在。如果函数定义是函数的本地定义,那么使用命名函数是否仍然存在漏洞?在javascript中,新声明的variabled被“提升”到名称空间的顶部。因此,您的示例与执行
var mycallback=function(){…}
Edit:My bad,您的示例很好,因为它是一个IIFE。