【发布时间】:2014-06-17 15:44:51
【问题描述】:
使用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,则为未内联函数。但是,如果我们手动命名函数并通过它的名称调用它,我们已经提供了对该函数的引用,因此“阻碍了像内联函数这样的优化”。
Olliej's argument 基本上是“内联和尾递归 [变得] 在一般情况下是不可能的 [而如果使用命名则可能]”。然而,没有提供任何证据,这似乎是一种挥手(另见他帖子下方的 cmets)。
为什么函数命名比使用arguments.callee 更高效?
【问题讨论】:
-
我认为 MDN 指的是命名函数表达式,而不是分配给变量的匿名函数表达式(即
(function f(){}))。
标签: javascript performance function optimization