3

これは一種のランダムな質問ですが、無名関数と比較して、名前付きコールバックがクリック イベントに対してなぜパフォーマンスが悪いのか疑問に思っていました。

これは、 Mac 上の Firefox と Chrome で実行したJSPerfテストへのリンクです。

私の推測では、名前付きコールバックは常にパフォーマンスが向上するということでした。たとえば.each、名前付きコールバックを使用すると、わずかに速くなります。

御時間ありがとうございます!

編集.eachJSPerf テストを編集したのは、(a) 意図したことをテストしていなかったため、(b)イベントをもっと模倣しようとしているからです。

編集2 @Esailjaが以下で指摘しているように、私のテスト設定は最初から間違っていました。この質問はあまり意味がありませんが、少なくとも JSPerf のテストに役立つかもしれません。

4

2 に答える 2

2

テストの境界を越えてイベント ハンドラーを蓄積するため、jsperf が壊れています。つまり、最初に実行されたテストが「最速」になります。

そして、テストの全体的な前提はばかげています。他のすべてが等しい場合、名前を持つ関数と名前を持たない関数の間に違いはありません。jsperf を正しく設定していない場合にのみ違いが見られます。それらに対して常に等しい結果が得られる場合、それを正しく設定したことがわかります-しかし、これは常識からすでにわかっているでしょう:)

于 2013-11-09T13:39:23.537 に答える
1

匿名関数は引数として渡されるため、その参照を解決するために、スコープ チェーンはそれを作成した親関数までさかのぼらず、引数としてのみ存在します。一方、名前付き関数への参照を解決するには、名前付き関数が作成された親関数クロージャまでスコープ チェーンをたどります。

編集: これを証明しようとしましたが、匿名関数が実際にはより速く解決されないようです- http://jsperf.com/scope-chain-anonymous-function

編集:イベントハンドラーを削除するために呼び出すa.off();と、名前付き関数は匿名関数を解決するのと同じかそれ以上速くなります。

于 2013-11-07T03:32:31.883 に答える