4

前段时间我读到你不应该Function.caller在函数内部使用,因为它使函数不可内联。为了测试这个断言,我编写了以下基准:

Function.caller 会影响性能吗?· jsPerf

结果证明 usingFunction.caller确实使函数执行速度比正常慢:

  1. 在 Opera 中它慢了 16%。
  2. 在 Chrome 中,它慢了 80%。
  3. 在 Firefox 中,它慢了 100%。

因此我的问题是:Function.caller在 JavaScript 中使用的共识是什么?可以少用吗?应该完全避开吗?

4

2 回答 2

2

据我所知,在模式下不允许使用 caller/callee/etc 动态检查执行堆栈,strict因此您可以将其视为一种共识,尽可能避免使用此功能。

无论如何,你为什么要首先使用 Function.caller 呢?它使您的代码依赖于通常无关紧要的东西(调用堆栈),并且数据被隐式传递而不是通过显式参数传递。我见过的这种功能的唯一真正用途是打印堆栈跟踪,在这种情况下,您通常可以支付性能成本,或者可以使用调试器绕过它。

于 2013-08-15T23:15:40.567 回答
1

如果性能是您唯一关心的问题,那可能没问题。虽然比不引用要慢得多caller,但我的机器仍然可以每秒执行 160 万次。

“慢”可以是一个相对术语。如果您只需要很少调用它,那么它在大多数情况下都足够快。我只是不会把它放在一个大循环中,迭代我游戏中的每个动画帧。

但是,这个魔法属性还有其他问题。正如@missingno 指出的那样,除了性能之外,还有更多的担忧。

于 2013-08-15T23:16:36.140 回答