为什么arguments.callee会损害性能?

时间:2014-05-01 06:20:55

标签: javascript performance function optimization

使用arguments.callee的替代方法是简单地命名函数,如下:

// Snippet 1, using arguments.callee:
(function(){
    document.body.innerHTML += 'qwe';
    setTimeout(arguments.callee, 1);
})()

// Snippet 2, using naming:
(function f(){
    document.body.innerHTML += 'qwe';
    setTimeout(f, 1);
})()

什么阻止JavaScript引擎/编译器自动将Snippet 1优化为上面的Snippet 2?是否存在固有的限制?

  • MDN's argument基本归结为:

      

    .. arguments.callee大大阻碍了内联等优化   函数,因为它必须能够提供引用   如果访问arguments.callee,则为非内联函数。

    但是,如果我们手动命名函数并通过它的名称调用它,我们已经提供对函数的引用,因此“阻碍了内联函数的优化”。

    < / LI>
  • Olliej's argument基本上是“内联和尾递归[在一般情况下变得不可能] [而如果使用命名则可能]”。然而,没有提供任何证据,它似乎是一个手动波(也见他的帖子下面的评论)。

为什么功能命名比使用arguments.callee更有效?

1 个答案:

答案 0 :(得分:0)

通过我的阅读,MDN并没有说“很难提供对无内联功能的引用”;相反,它说“很难确保当你访问arguments.callee时,你会得到对非内联函数的引用”。

(这只是你问题的答案的一半,因为我仍然不清楚为什么arguments.callee应该比arguments的其余部分更难以保持最新状态,或者比this。所以现在的论点显然并不引人注目。但这就是我认为MDN所说的。)