225
|
pcorcoran · 技术社区 · 16 年前 |
![]() |
1
258
早期版本的JavaScript不允许命名函数表达式,因此我们无法制作递归函数表达式:
为了解决这个问题,
然而,这实际上是一个非常糟糕的解决方案,因为这(结合其他参数、被调用者和调用者问题)在一般情况下使内联和尾部递归变得不可能(在某些情况下,你可以通过跟踪等实现它,但即使是最好的代码也是次优的,因为否则不需要进行检查)。另一个主要问题是递归调用将得到不同的结果
无论如何,EcmaScript 3通过允许命名函数表达式解决了这些问题,例如:
这有很多好处:
哇,
我刚刚意识到,除了其他问题,这个问题还涉及
在任何时间点,你都可以找到堆栈上任何函数的最深调用者,正如我上面所说,查看调用堆栈有一个主要影响:它使大量优化变得不可能,或者变得更加困难。
如果我们不能保证某个功能
如果js解释器不能保证在调用时提供的所有参数都是数字,那么它需要在内联代码之前插入对所有参数的检查,或者它不能内联函数。 现在,在这种特殊情况下,智能解释器应该能够重新排列检查以使其更加优化,并且不会检查任何不会使用的值。然而,在许多情况下,这是不可能的,因此不可能内联。 |
![]() |
2
89
因此,情况并不理想,但如果你想在所有主要浏览器上访问Javascript中的调用函数,你可以使用
|
![]() |
3
29
最好使用 命名函数 比arguments.callee:
胜过
命名函数将通过以下方式访问其调用者 caller 财产:
这比
弃用是由于当前的ECMAScript design principles . |
![]() |
4
0
它仍然适用于js
|