2009年、ECMAScript 5は、オブジェクトをパラメーターとして受け取り、this
が常に渡したオブジェクトを参照する同一の関数を返す組み込みのbind()
関数を追加しました。 (正規のドキュメントリンクのように見えるものは見つかりませんでした。)
これは jQueryの$.proxy()
function とどう違うのですか? ECMAScript 5がリリースされる前に、$.proxy()
が最初に来ましたか? $.proxy(function(){}, this)
よりもfunction(){}.bind(this)
を好む特別な理由はありますか?
proxy
が最初に来ました。これは標準であるため、bind
を優先する必要があります。それらの呼び出し方法はわずかに異なりますが(Function.prototype
にアタッチされているため、関数であるため)、動作は同じです。
ここにかなり良い投稿があります: jQuery.proxy()usage 、それはそのアドバイスで終わります。
この投稿には注意を払わないでください(受け入れられた回答ですが)。
簡単に言うと、APIドキュメントを検索するだけでなく、質問のコンテキストについて推測するのは私自身の責任であり、自分の愚かさを理解する前に答えとして受け入れられました(推測を行う、それらを検証せずに)そしてそれを削除します。
Matt Whippleの答えは100%正解であり、実際のプロキシはJSでは役に立たないという彼の声明には同意しませんが(一部の低レベルの懸念では素晴らしいでしょう)、彼の残りの声明は客観的に完全に正しいです(実際のことを除いて) _.bind
_と_.proxy
_の日付は、_.bind
_がブラウザに一貫して表示される前の仕様年であったため)。
トマトを自由に投げてください。
私が答えた理由を知りたい場合は、以下のコメントを読んでください。
$({}).proxy()
とfunc.bind({})
の違いは、プロキシが緩い接続であるということです。いつでも切り離すことができます。それがプロキシの目的です。あなたがやりたいことと実際にそれをすることの間の目に見えないインターフェース。
記録のために、プロキシではない
$.bind()
もあります。つまり、func.bind()
と同じ方法で、this
に完全にバインドします。メディエーターシステムを実装して、コンテキストを関数に自由にアタッチおよびデタッチするのではありません。
$.proxy
が最初に来ました。以下は、関数呼び出しで特定のコンテキストを保持する簡単な方法です。
var myProxy = (function(context,fn){
return function(){
fn.call(context);
}
})( myContext, myFn );
Jqueryが出る前にこれを簡単に使うことができました。
答えは簡単です:bind
は公式です。 bind
を使用します-スクリプトの実行に必要なブラウザで実際にサポートされている場合
From アンダースコアバインドvs jQuery.proxy vsネイティブバインド
すでに述べたことに加えて、$.proxy()
と.bind
の間には別の違いがあります。 $ .proxyでバインドされたメソッドは、複数回呼び出された場合に同じ参照を返します。 jQueryは、オブジェクトにプロキシされた関数をキャッシュします。
これは、パフォーマンスの比較のために試すことができるテストです。
http://jsperf.com/bind-vs-jquery-proxy/5
現時点では、2014年10月です。パフォーマンスはブラウザ間で狂ったように異なります。 IE 11ネイティブバインドが最速です。
ただし、テストした3つのブラウザーすべてについて、ネイティブはプリフォームjqueryプロキシをバインドします。また、bind()は標準であるため、可能であればそれに固執することをお勧めします。