次の「関数」は何をしますか?
$('.event-row').on('mouseover',function(){
arc.event_handler.event_row_over();
});
$('.event-row').on('mouseover',arc.event_handler.event_row_over );
次の「関数」は何をしますか?
$('.event-row').on('mouseover',function(){
arc.event_handler.event_row_over();
});
$('.event-row').on('mouseover',arc.event_handler.event_row_over );
非常に重要な違いがあります。
最初のものは、コンテキストのthis
値をevent_handler
オブジェクトとして関数を呼び出します。
2 つ目は、ハンドラーがバインドされている DOM 要素としてコンテキストの値を使用して関数を呼び出します。this
したがって、最初のものは、関数で必要になる可能性がある、予想される呼び出しコンテキスト値を保持します。 this
this
最初のケースでは、その関数内の無名関数は、イベントの原因となった DOM 要素にバインドされます。これはブラウザーで一般的な規則であり、イベントをネイティブにバインドするときにも行われます。arc.event_handler.event_row_over();
ただし、呼び出すと、内部this
に再バインドされます。オブジェクトメソッドとして呼び出され、そのような場合、メソッドが呼び出されたオブジェクトを指します。メソッドは引数なしで呼び出されます。arc.event_handler
event_row_over
this
arc.event_handler.event_row_over
2 番目のケースでは、イベントの関数を登録します。jQuery が呼び出されるとthis
、関連する要素に設定されるため、その要素event_row_over
をthis
指します。arc.event_handler
それを指す他の変数がない限り、そこでは利用できません。jQuery はイベント オブジェクトも最初の引数として渡すため、メソッドはその引数で呼び出されます。
通常、オブジェクト メソッドはthis
オブジェクトであることを期待するため、ほとんどの場合、無名関数を使用して呼び出しをラップします。this
要素が重要な場合は、メソッドに引数として渡します。
匿名関数を使用しない別の方法は、bind()
すべての関数が持っているメソッドを使用することです。
$('.event-row').on('mouseover', arc.event_handler.event_row_over.bind(arc.event_handler));
ただし、これをネイティブにサポートするのは最新のブラウザーのみです。
最初のケースでは、関数呼び出しを無名関数で囲んでいます。
2 番目のケースでは、関数ポインタを割り当てているだけです。
まず、そこに余分なドットがあるようです..arc.event_handler.event_row_over.();
おそらくただのはずですarc.event_handler.event_row_over();
そして、匿名関数が行うことはevent_row_over
、arc.event_handler
オブジェクトの名前の付いたメンバー関数を呼び出すことだけです。そしてそれは何も返しません。
「関数」キーワードは、新しいクロージャーを作成し、スコープをカプセル化します。閉鎖に関する良い記事https://developer.mozilla.org/en-US/docs/JavaScript/Guide/Closures。
関数のコンテキスト/スコープは同じではありません。
また、2つ目で、
$('.event-row').on('mouseover',arc.event_handler.event_row_over );
イベントオブジェクトを引数として取得しています。
最初のケースでは、追加の関数ラッパーがあります。これは、実際のイベント ハンドラ '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);
上記はすべて動作が似ていますが、より多くのラッパー関数を使用すると、より多くの抽象化が得られます。ただし、パフォーマンスが低下し、場合によっては読みやすさが低下します。