4

少し前にFunction.caller、関数がインライン化できなくなるため、関数内で使用すべきではないことを読みました。このアサーションをテストするために、次のベンチマークを作成しました。

Function.caller はパフォーマンスに影響しますか? · jsPerf .

Function.caller結果は、実際に使用すると関数の実行が通常より遅くなることを証明しています。

  1. Opera では 16% 遅くなります。
  2. Chrome では 80% 遅くなります。
  3. Firefox では 100% 遅くなります。

したがって、私の質問は次のとおりです。JavaScript での使用に関するコンセンサスは何Function.callerですか? 控えめに使っても大丈夫ですか?それは完全に避けるべきですか?

4

2 に答える 2

2

私の知る限り、strictモードでは caller/callee/etc を使用して実行スタックを動的に検査することは許可されていないため、可能であればこの機能を回避するためのコンセンサスとして見ることができます。

とにかく、そもそも Function.caller を使用したいのはなぜですか? 通常は問題にならないもの (コール スタック) にコードが依存するようになり、データは明示的な引数ではなく暗黙的に渡されます。この種の機能の唯一の実際の用途は、スタック トレースを出力することです。その場合、通常、パフォーマンス コストを支払うか、デバッガーで回避できます。

于 2013-08-15T23:15:40.567 に答える
1

パフォーマンスが唯一の懸念事項である場合は、おそらく問題ありません。を参照しない場合よりも大幅に遅くなりますがcaller、私のマシンはそれを 1 秒あたり 160 万回実行できます。

「遅い」は相対的な用語です。めったに呼び出す必要がない場合は、ほとんどの場合、魔法のように十分に高速です。ゲームのすべてのアニメーション フレームで繰り返される大きなループには入れません。

ただし、この魔法の特性には別の問題があります。@missingno が指摘しているように、パフォーマンス以外にも懸念事項があります。

于 2013-08-15T23:16:36.140 に答える