0

次の「関数」は何をしますか?

$('.event-row').on('mouseover',function(){
  arc.event_handler.event_row_over();
  });

$('.event-row').on('mouseover',arc.event_handler.event_row_over );
4

7 に答える 7

3

非常に重要な違いがあります。

  • 最初のものは、コンテキストthis値をevent_handlerオブジェクトとして関数を呼び出します。

  • 2 つ目は、ハンドラーがバインドされている DOM 要素としてコンテキストの値を使用して関数を呼び出します。this

したがって、最初のものは、関数で必要になる可能性がある、予想される呼び出しコンテキスト値を保持します。 this

于 2012-11-01T02:33:05.763 に答える
3

this最初のケースでは、その関数内の無名関数は、イベントの原因となった DOM 要素にバインドされます。これはブラウザーで一般的な規則であり、イベントをネイティブにバインドするときにも行われます。arc.event_handler.event_row_over();ただし、呼び出すと、内部thisに再バインドされます。オブジェクトメソッドとして呼び出され、そのような場合、メソッドが呼び出されたオブジェクトを指します。メソッドは引数なしで呼び出されます。arc.event_handlerevent_row_overthis

arc.event_handler.event_row_over2 番目のケースでは、イベントの関数を登録します。jQuery が呼び出されるとthis、関連する要素に設定されるため、その要素event_row_overthis指します。arc.event_handlerそれを指す他の変数がない限り、そこでは利用できません。jQuery はイベント オブジェクトも最初の引数として渡すため、メソッドはその引数で呼び出されます。

通常、オブジェクト メソッドはthisオブジェクトであることを期待するため、ほとんどの場合、無名関数を使用して呼び出しをラップします。this要素が重要な場合は、メソッドに引数として渡します。

匿名関数を使用しない別の方法は、bind()すべての関数が持っているメソッドを使用することです。

$('.event-row').on('mouseover', arc.event_handler.event_row_over.bind(arc.event_handler));

ただし、これをネイティブにサポートするのは最新のブラウザーのみです。

于 2012-11-01T02:41:06.800 に答える
1

最初のケースでは、関数呼び出しを無名関数で囲んでいます。

2 番目のケースでは、関数ポインタを割り当てているだけです。

于 2012-11-01T02:29:51.007 に答える
1

まず、そこに余分なドットがあるようです..arc.event_handler.event_row_over.();おそらくただのはずですarc.event_handler.event_row_over();

そして、匿名関数が行うことはevent_row_overarc.event_handlerオブジェクトの名前の付いたメンバー関数を呼び出すことだけです。そしてそれは何も返しません。

于 2012-11-01T02:30:41.820 に答える
1

「関数」キーワードは、新しいクロージャーを作成し、スコープをカプセル化します。閉鎖に関する良い記事https://developer.mozilla.org/en-US/docs/JavaScript/Guide/Closures

于 2012-11-01T02:33:03.890 に答える
1

関数のコンテキスト/スコープは同じではありません。

また、2つ目で、

$('.event-row').on('mouseover',arc.event_handler.event_row_over );

イベントオブジェクトを引数として取得しています。

于 2012-11-01T02:35:59.370 に答える
1

最初のケースでは、追加の関数ラッパーがあります。これは、実際のイベント ハンドラ 'arc.event_handler.event_row_over()' を呼び出す前に何か他のことをしたい場合に便利です。たとえば、次のようなことを行うことができます。

$('.event-row').on('mouseover',function(){
  doPreEventHandling();
  arc.event_handler.event_row_over();
  doPostEventHandling();
});

一方、匿名関数を名前付き関数として抽出し、以下のように呼び出すこともできます。

var eventHandler = function(){
      doPreEventHandling();
      arc.event_handler.event_row_over();
      doPostEventHandling();
};

$('.event-row').on('mouseover', eventHandler);

上記はすべて動作が似ていますが、より多くのラッパー関数を使用すると、より多くの抽象化が得られます。ただし、パフォーマンスが低下し、場合によっては読みやすさが低下します。

于 2012-11-01T02:36:45.773 に答える