Javascript中的匿名函数和传统函数之间是否存在内存使用差异?如果是这样,怎么样?

时间:2012-06-28 08:49:39

标签: javascript closures anonymous-function

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

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

1 个答案:

答案 0 :(得分:5)

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

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

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

全球(过早优化是根等。)我建议你喜欢可读性,只要你没有乱码问题。 Javascript引擎及其GC发生了很大变化,因此您的努力可能毫无用处。

Google有an interesting notice about closure and memory