在JavaScript中使用Function.caller的共识是什么?

时间:2013-08-15 23:06:49

标签: javascript performance

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

Does Function.caller affect preformance? · jsPerf

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

  1. 在Opera中它慢了16%。
  2. 在Chrome中速度慢了80%。
  3. 在Firefox中它慢100%。
  4. 因此,我的问题是:在JavaScript中使用Function.caller的共识是什么?是否可以节制地使用它?它应该被完全避开吗?

2 个答案:

答案 0 :(得分:2)

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

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

答案 1 :(得分:1)

如果表现是你唯一关注的问题,那可能就好了。虽然比没有引用caller慢得多,但我的机器仍然可以达到每秒160万次。

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

然而,这个神奇的属性还有其他问题。正如@missingno指出的那样,有更多的顾虑而不仅仅是表现。