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

Javascript 是否缓存本地函数声明?,javascript,optimization,implementation,caching,Javascript,Optimization,Implementation,Caching,函数B是在每次调用A时创建的,还是在其上有一些缓存。不是让它成为本地的,就像: function A() { function B() { ... } B(); } 显著的性能改进 这是一种有效的风格选择吗?(B在这种情况下,它只是a的一个辅助功能)或者第二个功能在速度上更受欢迎吗 为了便于阅读,应该使用还是避免这种风格 对于本地情况,似乎是FF4内联B,并消除了函数调用开销 其他浏览器呢?Raynos,我查看了您的jsper

函数
B
是在每次调用
A
时创建的,还是在其上有一些缓存。不是让它成为本地的,就像:

function A() {
     function B() {
          ...
     }        
     B();
}
显著的性能改进

这是一种有效的风格选择吗?(
B
在这种情况下,它只是
a
的一个辅助功能)或者第二个功能在速度上更受欢迎吗

为了便于阅读,应该使用还是避免这种风格

对于本地情况,似乎是FF4内联
B
,并消除了函数调用开销


其他浏览器呢?

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

请参阅下面的链接。这有用吗

我想说:

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

  • 就百分比而言,性能改进是显著的。但是,如果实际函数以微秒为单位运行,您可能不会注意到差异

  • 另一个需要考虑的问题是,B(helper函数)是“私有的”(换句话说,仅在A内部可见)有多重要。请参见“我的链接”中的“外部即时”功能,了解中间路线选项


  • 这很奇怪,因为我猜每次调用另一个函数时重新声明一个函数会降低执行时间

    有人对此有答案吗


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

    在JS中声明一个内部函数的目的可能是在词汇上绑定到外部函数的局部变量/参数。将其作为一个顶级功能将违背这一目的


    回答这个问题:是的,内部函数每次都被创建,至少在理论上是这样,这是您在编写代码时应该如何看待它的,但是智能优化器仍然可以将其转换为顶级函数,即使您具有词法依赖性。如果这是一个微观优化,我就不麻烦了,因为拥有一个内部函数也可以达到可读性和声明意图的目的。

    在另一个函数中声明一个函数是不好的。在第一个示例中,B()应该是一个表达式。请看这里:看起来您的测试用例不正确;您实际上并不是在执行这些函数,而是在声明它们。结账Chrome似乎没有优化。我怀疑任何引擎都不会。@Matt Oh。。我忘了给他们打电话了。多么愚蠢:(@DanMan是的,这是正确的。不允许在块内声明函数。这与函数内声明函数不同。这是因为没有块作用域。浏览器模拟块作用域进行函数声明确实存在问题,这非常糟糕。但这与函数声明无关去函数化。@杰西·哈利特:你说得对。看起来我没有区分块和函数。谢谢你澄清这一点。遗憾的是浏览器没有通过缓存来优化这一点。它确实会降低执行时间,我的基准测试没有调用函数。
    function A() {
        B();
    }
    function B() {
        ...
    }