2011-03-24 61 views
7
function A() { 
    function B() { 
      ... 
    }   
    B(); 
} 

功能B每次调用A或者是否有一些缓存。是不是让它像本地一样:缓存本地函数声明吗?

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

显着的性能改进?

是否有效做到这一点的风格选择? (B在这种情况下只是A的辅助功能。)或者第二个应该受到速度的青睐?

为了便于阅读,应该使用还是避免使用此样式?

Benchmark

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

其他浏览器呢?

+0

在另一个里面声明一个函数是不好的。在你的第一个例子中B()应该是一个表达式。看到这里:http://stackoverflow.com/questions/1013385/what-is-the-difference-between-a-function-expression-vs-declaration-in-javascript – DanMan 2011-03-24 18:06:50

+1

它看起来像你的测试案例是不正确的;你实际上并没有执行这些函数,只是声明它们。结帐http://jsperf.com/inner-function-optimization。 Chrome似乎没有优化。我怀疑任何引擎会。 – Matt 2011-03-24 18:38:22

+0

@Matt哦..我忘了给他们打电话。多么愚蠢:( – Raynos 2011-03-24 20:18:49

回答

4

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

要回答的问题是:是的,内在功能创建的每个时间,至少在理论上,这是写代码时,你应该如何看待它,但一个聪明的优化器仍可以将其转换为一个顶级函数,即使你有词汇依赖关系。如果这是一个微型优化,我不会因为拥有一个内部函数而达到可读性和声明你的意图的目的。

0

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

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

Another benchmark

我要说的是:

  1. 在你的示例代码,B创建的每个被调用的时间。 (在我上面的示例中,请参阅外部普通测试。)

  2. 百分比方面,性能改进很显着。但是,如果真实世界的功能以微秒运行,您可能不会注意到其中的差异。

  3. 另一个考虑是B(辅助函数)是“私人”(换句话说,只在A内部可见)它有多重要。查看我的链接中的外部即时功能以获得中途选项。

+0

很遗憾,浏览器不会使用缓存来优化这个功能。 – Raynos 2011-03-24 20:21:25

0

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

有没有人有这个答案?

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

+0

它确实减慢了执行时间,我的基准没有调用函数。 – Raynos 2011-03-25 11:20:50