是否缓存了本地函数声明?

时间:2011-03-24 14:53:37

标签: javascript optimization implementation caching

function A() {
     function B() {
          ...
     }        
     B();
}

每次调用B时是否创建了函数A,或者是否有一些缓存。是不是像当地一样:

function A() {
    B();
}
function B() {
    ...
}

显着的性能提升?

这样做风格选择有效吗? (B在这种情况下只是A的帮助函数。)或第二个是否应该受到速度的青睐?

是否应该使用或避免使用此样式以提高可读性?

Benchmark

似乎FF4为本地案例内联B并删除了函数调用开销。

其他浏览器怎么样?

3 个答案:

答案 0 :(得分:4)

在JS中声明一个内部函数可能的目的是在词法上绑定到外部函数的局部变量/参数。把它变成顶级功能就会失败。

回答这个问题:是的,内部函数每次创建,至少在理论上是这样,这是你在编写代码时应该如何查看它,但智能优化器仍然可以将它转换为顶级函数即使你有词汇依赖。如果它是一个微观优化,我不会打扰,因为内部函数也有可读性和声明你的意图。

答案 1 :(得分:0)

Raynos,我查看了你的jsperf测试,看起来你正在测试函数声明,而不是函数执行。

请参阅以下链接。这有用吗?

Another benchmark

我会说:

  1. 在示例代码中,每次调用A时都会创建B. (在上面链接的示例中,请参阅外部普通测试。)

  2. 百分比方面,性能提升非常显着。但是,如果真实世界的函数以微秒为单位运行,您可能不会注意到差异。

  3. 另一个考虑因素是B(辅助函数)对“私有”(换言之,仅在A内部可见)的重要性。请参阅我的链接中的“外部立即”功能,以获取中间选项。

答案 2 :(得分:0)

这很奇怪,因为我猜想每次调用另一个函数时重新声明一个函数会减慢执行时间。

有没有人对此有答案?

我能想出的唯一解决方案是,函数C必须离开它的范围,向上移动到全局范围,执行函数D,然后返回。而功能A通过执行保持在一个范围内。有什么想法吗?