前段时间我读到你不应该在函数中使用Function.caller
因为它使函数不可内联。为了测试这个断言,我写了以下基准:
Does Function.caller affect preformance? · jsPerf
结果证明使用Function.caller
确实使函数执行速度比正常情况慢:
因此,我的问题是:在JavaScript中使用Function.caller
的共识是什么?是否可以节制地使用它?它应该被完全避开吗?
答案 0 :(得分:2)
据我所知,在strict
模式下不允许使用caller / callee / etc动态检查执行堆栈,因此如果可能的话,您可以将其视为共识以避免此功能。
无论如何,为什么你甚至想首先使用Function.caller?它使你的代码依赖于通常无关紧要的东西(调用堆栈),数据被隐式传递而不是通过显式参数传递。我见过这种功能的唯一真正用途是打印堆栈跟踪,在这种情况下,您通常可以支付性能成本,或者可以使用调试器解决它。
答案 1 :(得分:1)
如果表现是你唯一关注的问题,那可能就好了。虽然比没有引用caller
慢得多,但我的机器仍然可以达到每秒160万次。
“慢”可以是相对术语。如果你只需要很少打电话,那么大多数情况下它的速度都很快。我不会把它放在一个大循环中,迭代我游戏中的每个动画帧。
然而,这个神奇的属性还有其他问题。正如@missingno指出的那样,有更多的顾虑而不仅仅是表现。