からドキュメント.proxy()
引数として渡される関数のスコープが変わることは理解しています。誰かこれをもっとわかりやすく説明してもらえませんか? なぜそうする必要があるのですか?
ベストアンサー1
this
最終的に、関数内のの値が希望する値になることを保証します。
一般的な例は、ハンドラーsetTimeout
内で実行されるですclick
。
これを取る:
$('#myElement').click(function() {
// In this function, "this" is our DOM element.
$(this).addClass('aNewClass');
});
意図は非常に単純です。myElement
がクリックされると、クラス が取得されますaNewClass
。ハンドラーの内部では、this
クリックされた要素を表します。
しかし、クラスを追加する前に少し遅延が必要な場合はどうすればよいでしょうか。setTimeout
これを実現するために を使用することもできますが、問題は にどのような関数を与えてもsetTimeout
、その関数内の の値が要素ではなく にthis
なってしまうことです。window
$('#myElement').click(function() {
setTimeout(function() {
// Problem! In this function "this" is not our element!
$(this).addClass('aNewClass');
}, 1000);
});
代わりに、 を呼び出して$.proxy()
、 に割り当てたい関数と値を送信するthis
と、その値を保持する関数が返されます。
$('#myElement').click(function() {
// ------------------v--------give $.proxy our function,
setTimeout($.proxy(function() {
$(this).addClass('aNewClass'); // Now "this" is again our element
}, this), 1000);
// ---^--------------and tell it that we want our DOM element to be the
// value of "this" in the function
});
したがって、$.proxy()
関数と、 に必要な値を指定すると、 が適切に設定されているthis
ことを確認する関数が返されますthis
。
どうやってやるの?匿名関数を返すだけで、通話メソッドを使用して関数を実行し.apply()
、 の値を明示的に設定しますthis
。
返される関数を簡略化すると次のようになります。
function() {
// v--------func is the function we gave to $.proxy
func.apply( ctx );
// ----------^------ ctx is the value we wanted for "this" (our DOM element)
}
したがって、この匿名関数は に渡されsetTimeout
、適切なコンテキストで元の関数を実行するだけですthis
。