使用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
更有效?
答案 0 :(得分:0)
通过我的阅读,MDN并没有说“很难提供对无内联功能的引用”;相反,它说“很难确保当你访问arguments.callee
时,你会得到对非内联函数的引用”。
(这只是你问题的答案的一半,因为我仍然不清楚为什么arguments.callee
应该比arguments
的其余部分更难以保持最新状态,或者比this
。所以现在的论点显然并不引人注目。但这就是我认为MDN所说的。)