【问题标题】:Is there any memory usage difference between anonymous functions and traditional functions in Javascript? if so, how?Javascript 中的匿名函数和传统函数之间是否存在内存使用差异?如果是这样,如何?
【发布时间】:2012-06-28 08:49:39
【问题描述】:

Javascript中的匿名函数和普通函数在内存使用上有什么区别吗?

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

【问题讨论】:

  • 如果您的意思是匿名函数与命名函数,我认为推荐其中一个对性能没有影响。你可以尝试做一个简单的 jsPerf 测试

标签: javascript closures anonymous-function


【解决方案1】:

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

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

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

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

谷歌有an interesting notice about closure and memory

【讨论】:

  • 不要试图使您的答案无效,但参考您的陈述会很好:)(规范/测试)
  • 我加了一个。如果我记得其他人,我会添加。
  • 在第一点我明白,匿名函数可以在我们不使用它们时被垃圾处理。但是在第三点你说匿名函数不能在它们之前被垃圾处理.....你可以吗详细解释一下?
  • 我稍微详细一点,试图更清楚。但我建议您按照我在最后提供的链接对主题有一个完美的了解。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-12-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多