2016-11-29 9 views
0

jQueryでイベントハンドラとして関数参照を渡そうとしています。私はむしろ、明示的に全体の機能体を渡すよりも... ...以下の簡単な例のように速記を使用する関数リファレンスをjQueryのイベントハンドラとして渡します

$("a").click(console.debug.bind(undefined,this)); 

をしたいと思います:

$("a").click(function() { 
    console.debug(this) 
}); 

また、私は要素にアクセスしたいと思います私の短縮形の関数でjQueryによって選択され(パラメータとして渡します)。言い換えれば、$("a")という結果をthis(または結果を取得する他のコード)とすることを期待しています。

これまでのところ、私が試した:ここ

var a = function() { 
    console.debug(this); 
}; 

var b = console.debug.bind(undefined,this); 

$("a").click(function() {console.debug(this)}); // prints link 
$("a").click(a); // prints link 
b(); // prints Window 
$("a").click(console.debug.bind(undefined,this)); // prints Window & jQuery.Event 

はフィドルです: https://jsfiddle.net/hbqw2z93/1/

私の質問は以下のとおりです。

  1. は、それがこのような構造を使用して、すべての要件を満たすことは可能です上記のように1行だけ追加変数を定義しなくてもかまいません。
  2. 上記の方法でjQueryの選択結果にアクセスできますか?
  3. なぜ特定のスコープでthisが 'merged' WindowとjQuery.Eventオブジェクトになるのですか?

答えて

1
  • あなたは既にそれを使用していますか? :)それは限られていますが、あなた自身のフィドルで動作します

  • jQueryは指定された関数にイベントオブジェクトを渡します。あなたは関数のバインドを引数として渡すことができます(あなたは既にあなたのフィドルでこの機能を持っています)

  • これはありません。何が起きているのかを確認してください:

jQuery passed one argumentクリックすると、ハンドラ関数 - イベントオブジェクトが表示されます。ハンドラ関数としてconsole.debug.bind(undefined, this)を渡すので、jQueryは1つの引数で呼び出します。

次に、関数内に 'this'オブジェクトとしてyou are asking to use 'undefined'をバインドして、余分な引数を送信すると '最高'のレベルでバインドされているため、このスコープのウィンドウです。

実際のクリックが発生したとき、jQueryは、click()でバインドされたWindowオブジェクトとclickハンドラに常に渡されるjQueryイベントの2つのパラメータでconsole.debugを呼び出します。 console.debug()は、複数のオブジェクトを受け入れて表示することができます。これは、開発者コンソールに表示されるものとまったく同じです。

+0

渡されていないものと同じです。これはundefinedを使用しません。また、ウィンドウをデバッグメソッドに渡すだけで、 'this'はデバッグに渡されません。 –

+0

もちろん 'this'が渡されます。そのため、彼はコンソールに2つのオブジェクトを受け取りました。未定義に関するコメントは単なる言語的なアブラカダブラです:)この関数は 'this'を持たないので、実際には 'this'として 'undefined'を使用しているような気がします:)) –

1

bindの最初のパラメータは、thisに使用する新しいコンテキストです。 undefinedを渡すことによって、基本的に最初のパラメータを渡すことはありません。

2番目以降のパラメータは、最初の値として関数に渡されます。

また、thisは、グローバルスコープではwindowオブジェクトを指します。あなたはdebugに最初のパラメータとして(windowである)thisを渡している..sinceだからここ

b ...

console.debug.bind(undefined,this); 

function(){ console.debug(window); } 

...と同じです。

デフォルトでは、イベントを要素に添付すると、thisはイベントを捕捉した要素を自動的に指し示すので、バインドは必要ありません。したがって、$("a").click(a);はバインドを使用せずに動作しました。

関連する問題