2016-07-06 3 views
0

は、私は関数に不明なJavaScript関数

function bind(method, context) { 
    var args = Array.prototype.slice.call(arguments, 2); 
    return function() { 
     var a = args.concat(Array.prototype.slice.call(arguments, 0)); 
     return method.apply(context, a); 
    } 
} 

を持って質問されました:この機能が働いて、それが使用することができます何のためか。

私は、関数のbind(およびreturn関数も)配列のような引数を実際の配列に変換することを理解しています。メソッドとコンテキストは配列に変換されません(2つのインデックスのため)。私はbind関数で余分なargsを渡すことができ、argsは返された関数と 'this'というコンテキストでメソッドを呼び出します。

私の質問は - それがどのように使用されるかです。方法と文脈 - 機能またはオブジェクト、または機能とオブジェクトですか?

+4

['Function.prototype.bind()'](https://developer.mozilla.org/en/docs/Web/JavaScript/Reference/Global_objects/Function/bind)と同じことをします – zerkms

答えて

1

この関数は通常、イベントハンドラ関数を生成します。

イベントに関数をサブスクライブし、その関数が呼び出されると、thisはどのハンドラを呼び出すかによって異なります。

関数の代わりにオブジェクトのメソッドを渡す場合は、thisでオブジェクトにアクセスする必要があります。

最初の2つの引数は、メソッド(バインドする関数)、コンテキスト(アクセスするオブジェクトはthis)です。他の固定引数を追加してハンドラに渡すこともできます関数が呼び出される度に呼び出されます。

この関数は、必要なイベントリスナーをサブスクライブするために使用する新しい関数を返します。この関数は、このイベントによって渡されたすべての引数を取得し、arguments配列に追加します。

最後に、applyという魔法を使って、コンテキストを変更して関数の引数として任意の配列を渡すことができます。

イベントサブスクリプションだけでなく、配列forEachmapなどのようなコールでも、この種の機能を使用できます。

+0

ありがとう非常に、zerkmsとマリオ!両方の答えは私にとって非常に便利です。私はそれがどのように機能し、何が使えるのか理解しています。この説明をありがとうございます! – Lucky

関連する問題