web-dev-qa-db-ja.com

$ .proxy()とbind()の違いは何ですか?

2009年、ECMAScript 5は、オブジェクトをパラメーターとして受け取り、thisが常に渡したオブジェクトを参照する同一の関数を返す組み込みのbind()関数を追加しました。 (正規のドキュメントリンクのように見えるものは見つかりませんでした。)

これは jQueryの$.proxy() function とどう違うのですか? ECMAScript 5がリリースされる前に、$.proxy()が最初に来ましたか? $.proxy(function(){}, this)よりもfunction(){}.bind(this)を好む特別な理由はありますか?

28
Max Cantor

proxyが最初に来ました。これは標準であるため、bindを優先する必要があります。それらの呼び出し方法はわずかに異なりますが(Function.prototypeにアタッチされているため、関数であるため)、動作は同じです。

ここにかなり良い投稿があります: jQuery.proxy()usage 、それはそのアドバイスで終わります。

33
Matt Whipple

編集

この投稿には注意を払わないでください(受け入れられた回答ですが)。
簡単に言うと、APIドキュメントを検索するだけでなく、質問のコンテキストについて推測するのは私自身の責任であり、自分の愚かさを理解する前に答えとして受け入れられました(推測を行う、それらを検証せずに)そしてそれを削除します。

Matt Whippleの答えは100%正解であり、実際のプロキシはJSでは役に立たないという彼の声明には同意しませんが(一部の低レベルの懸念では素晴らしいでしょう)、彼の残りの声明は客観的に完全に正しいです(実際のことを除いて) _.bind_と_.proxy_の日付は、_.bind_がブラウザに一貫して表示される前の仕様年であったため)。

以下は私の恥です、すべての人が見るための在庫にあります...

トマトを自由に投げてください。
私が答えた理由を知りたい場合は、以下のコメントを読んでください。


$({}).proxy()func.bind({})の違いは、プロキシが緩い接続であるということです。いつでも切り離すことができます。

それがプロキシの目的です。あなたがやりたいことと実際にそれをすることの間の目に見えないインターフェース。

記録のために、プロキシではない$.bind()もあります。つまり、func.bind()と同じ方法で、thisに完全にバインドします。メディエーターシステムを実装して、コンテキストを関数に自由にアタッチおよびデタッチするのではありません。

10
Norguard

$.proxyが最初に来ました。以下は、関数呼び出しで特定のコンテキストを保持する簡単な方法です。

var myProxy = (function(context,fn){
  return function(){
      fn.call(context);
  }
})( myContext, myFn );

Jqueryが出る前にこれを簡単に使うことができました。

答えは簡単です:bindは公式です。 bindを使用します-スクリプトの実行に必要なブラウザで実際にサポートされている場合

7
abuduba

From アンダースコアバインドvs jQuery.proxy vsネイティブバインド

すでに述べたことに加えて、$.proxy().bindの間には別の違いがあります。 $ .proxyでバインドされたメソッドは、複数回呼び出された場合に同じ参照を返します。 jQueryは、オブジェクトにプロキシされた関数をキャッシュします。

jsFiddle

5
Benny Bottema

これは、パフォーマンスの比較のために試すことができるテストです。

http://jsperf.com/bind-vs-jquery-proxy/5

現時点では、2014年10月です。パフォーマンスはブラウザ間で狂ったように異なります。 IE 11ネイティブバインドが最速です。

ただし、テストした3つのブラウザーすべてについて、ネイティブはプリフォームjqueryプロキシをバインドします。また、bind()は標準であるため、可能であればそれに固執することをお勧めします。

1
Morio