30

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

これはjQuery の$.proxy()関数とどう違うのですか? $.proxy()ECMAScript 5 がリリースされる前に最初に登場したのは? $.proxy(function(){}, this)を優先する特定の理由はありfunction(){}.bind(this)ますか?

4

5 に答える 5

37

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

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

于 2012-09-19T19:08:16.340 に答える
9

編集

この投稿には注意を払わないでください (受け入れられた回答であるにもかかわらず)。
簡単に言えば、APIドキュメントを調べるだけでなく、質問のコンテキストについて仮定を立てたのは私自身のせいであり、自分の愚かさに気付く前に答えとして受け入れられました(検証せずに仮定を立てました)そして消して。

Matt Whipple の答えは 100% 正しいです。実際のプロキシは JS では役に立たないという彼の声明には同意しませんが (いくつかの低レベルの問題では素晴らしいでしょう)、彼の残りの声明は完全に客観的に正しいです (実際のプロキシは別として)。.bindvs.proxyの日付は.bind、ブラウザに一貫して着陸する前の仕様の年にあったように)。

以下は、すべての人が見ることができる在庫の私の恥です...

気軽にトマトを投げてください。
なぜ私が自分のやり方で答えたのか知りたい場合は、以下のコメントを読んでください。


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

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

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

于 2012-09-19T19:51:36.193 に答える
8

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

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

jqueryが登場する前に、これを簡単に使用できました。

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

于 2012-09-19T19:14:27.417 に答える
6

Underscore bind vs jQuery.proxy vs Native bindから

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

jsフィドル

于 2014-09-05T10:28:21.143 に答える