【问题标题】:Are local function declarations cached?是否缓存了本地函数声明?
【发布时间】:2011-07-22 05:16:59
【问题描述】:
function A() {
     function B() {
          ...
     }        
     B();
}

函数 B 是在每次调用 A 时创建的,还是有一些缓存。没有像本地一样:

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

显着的性能提升?

这样选择样式是否有效? (在这种情况下,B 只是 A 的辅助函数。)还是应该优先考虑第二个?

为了可读性,应该使用还是避免使用这种样式?

Benchmark.

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

其他浏览器呢?

【问题讨论】:

  • 在另一个函数中声明一个函数是不好的。在您的第一个示例中, B() 应该是一个表达式。见这里:stackoverflow.com/questions/1013385/…
  • 您的测试用例似乎不正确;你实际上并没有执行函数,只是声明它们。结帐jsperf.com/inner-function-optimization。 Chrome 似乎没有优化。我怀疑任何引擎都会。
  • @Matt 哦.. 我忘了给他们打电话。多么愚蠢:(
  • @DanMan 是的,没错。块内的函数声明是不允许的。这与函数内部的函数声明不同。这是因为没有块作用域。浏览器为函数声明模拟块范围确实存在问题,这非常糟糕。但这与函数内部的函数声明无关。
  • @Jesse Hallett:你是对的。看起来我没有区分块和功能。感谢您清除它。

标签: javascript optimization implementation caching


【解决方案1】:

在 JS 中声明一个内部函数可能是为了在词法上绑定到外部函数的局部变量/参数。将其移出成为顶级功能会破坏该目的。

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

【讨论】:

    【解决方案2】:

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

    请参阅下面的链接。这有帮助吗?

    Another benchmark

    我会说:

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

    2. 就百分比而言,性能提升非常显着。但是,如果现实世界的函数在微秒内运行,您可能不会注意到差异。

    3. 另一个考虑因素是 B(辅助函数)“私有”(换句话说,仅在 A 内部可见)的重要性。请参阅我的链接中的 Outer Immediate 函数以获取中间选项。

    【讨论】:

    • 可惜浏览器没有通过缓存来优化这个。
    【解决方案3】:

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

    有人对此有答案吗?

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

    【讨论】:

    • 它确实减慢了执行时间,我的基准没有调用该函数。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2022-01-17
    • 2014-02-25
    • 2010-10-23
    • 1970-01-01
    • 2010-10-05
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多