使用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的观点基本上可以归结为:
..
arguments.callee
实际上会妨碍像内联函数这样的优化,因为如果访问了arguments.callee
,就必须能够提供对未内联函数的引用。但是,如果我们手动命名函数并通过其名称调用它,则已经提供了对该函数的引用,因此“妨碍像内联函数这样的优化”。
Olliej的观点基本上是“在一般情况下无法内联和尾递归[而使用命名则可能]”。然而没有提供证据,似乎只是一个泛泛而谈的说法(还请参见他文章下面的评论)。
arguments.callee
更高效?
(function f(){})
)。 - Qantas 94 Heavy