3

Javascript 中的匿名函数和普通函数之间是否存在内存使用差异?

如果是这样,怎么做?你能解释一下吗?

4

1 回答 1

5

如果“普通函数”是指function a(){在脚本的根级别声明的函数,即附加到窗口对象的函数,是的,存在差异:

  • 附加到窗口对象的函数不会被垃圾,而匿名函数一旦不再使用它们就会被垃圾。
  • 它们可能会减慢对窗口对象的其他变量的访问(在根级别附加函数有时会被限定为“混乱的全局命名空间”,但避免它的原因主要是为了拥有更简洁的代码并避免名称冲突)。
  • 匿名函数是闭包:它们保留一个指向其封闭范围的指针,这使得可以使用在此范围中定义的变量。一个副作用是这个范围不能在函数之前被垃圾,所以这个函数可能比你想象的要重,比“普通函数”还要重(你可以添加一个空的范围来包含匿名声明,如果你不这样做,可以防止这种影响需要范围的变量,但由于我不知道 javascript 引擎是否还可以优化封闭范围的一部分,所以如果您没有检测到循环引用,我建议您不要这样做)。

但是这些差异通常很小,您通常不必注意这一点。在您的大多数页面中,您的匿名函数无论如何都不会被垃圾,因为您没有删除事件处理程序(通常是匿名函数的第一个根本原因)。

在全球范围内(过早优化是根源等),只要您没有垃圾问题,我建议您偏爱可读性。Javascript 引擎和它们的 GC 变化很大,所以你的努力可能毫无用处。

谷歌有一个关于闭包和内存的有趣通知

于 2012-06-28T08:53:14.033 回答