ドキュメントから私はそれ.proxy()
が引数として渡される関数のスコープを変更することを理解しています。誰かがこれをもっとよく説明してくれませんか?なぜこれを行う必要があるのですか?
ドキュメントから私はそれ.proxy()
が引数として渡される関数のスコープを変更することを理解しています。誰かがこれをもっとよく説明してくれませんか?なぜこれを行う必要があるのですか?
回答:
それが最終的に行うことはthis
、関数内のの値がユーザーが望む値になることを保証することです。
一般的な例はsetTimeout
、click
ハンドラー内で発生するです。
これを取る:
$('#myElement').click(function() {
// In this function, "this" is our DOM element.
$(this).addClass('aNewClass');
});
その意図は十分単純です。myElement
をクリックすると、クラスが取得されますaNewClass
。ハンドラーの内側は、this
クリックされた要素を表します。
しかし、クラスを追加する前に短い遅延が必要な場合はどうでしょうか。私たちはsetTimeout
それを達成するためにa を使用するかもしれませんが、問題は私たちに与える関数が何であれ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
コンテキストで実行するだけです。
$.proxy(function () {...}, this)
ではなく使用することの価値は何(function() {...}).call(this)
ですか?違いはありますか?
.call
あなたはすぐに関数を呼び出しています。では$.proxy
、Function.prototype.bind
新しい関数を返すようなものです。その新しい関数にはthis
値が永続的にバインドされているため、それがに渡されて後で関数setTimeout
をsetTimeout
呼び出しても、正しいthis
値が保持されます。
詳細については説明しません(これはECMAScriptのコンテキスト、thisコンテキスト変数などのために必要です)。
ECMA- / Javascriptには、3つの異なるタイプの「コンテキスト」があります。
すべてのコードは、その実行コンテキストで実行されます。グローバルコンテキストが1つあり、関数(および評価)コンテキストのインスタンスが多数存在する可能性があります。今興味深い部分:
関数を呼び出すたびに、関数実行コンテキストに入ります。関数の実行コンテキストは次のようになります。
Activation Value
Scope Chain
this value
したがって、この値は実行コンテキストに関連する特別なオブジェクトです。ECMA- / Javascriptには、関数実行コンテキストでthis値を変更する可能性のある2つの関数があります。
.call()
.apply()
関数がある場合は、次の呼び出しでこの値をfoobar()
変更できます。
foobar.call({test: 5});
これでfoobar
、渡したオブジェクトにアクセスできます。
function foobar() {
this.test // === 5
}
これがまさに何をするかjQuery.proxy()
です。function
and context
(これはオブジェクトにすぎません)を受け取り、.call()
or .apply()
を呼び出して関数をリンクし、その新しい関数を返します。
同じ目的は、「即時に呼び出される関数式、短い:IIFE」自己実行関数を使用して達成できます 。
$('#myElement').click(function() {
(function(el){
setTimeout(function() {
// Problem! In this function "this" is not our element!
el.addClass('colorme');
}, 1000);
})($(this)); // self executing function
});
.colorme{
color:red;
font-size:20px;
}
<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8">
<meta name="viewport" content="width=device-width">
<title>JS Bin</title>
</head>
<body>
<script src="https://code.jquery.com/jquery-3.1.0.js"></script>
<div id="myElement">Click me</div>
</body>
</html>