web-dev-qa-db-ja.com

「呼び出し/適用」と「バインド」の違いは何ですか

var obj = {
   x: 81,
   getX: function() { 
     console.log( this.x) 
   }
};
var getX = obj.getX.bind(obj);//use obj as 'this';
getX();//81
var getX = function(){
  obj.getX.apply(obj); 
}
getX();//also 81

Bindとcall/applyの使い方はよく似ていますが、それらの違いは何なのか知りたいです。上の2つのgetX関数は同じですか?

32
bennyrice

bindは、元の関数のように機能しますが、thisが事前定義されている関数を返します。これは通常、イベントハンドラーまたはその他の非同期コールバックに関数を渡したい場合に使用されます。

callapplyは関数をすぐに呼び出し、thisの値と関数が受け取る引数の両方を指定できます。

2番目の例では、applyを呼び出す無名関数を定義しています。これは一般的なパターンです。 bindは、単純な関数呼び出しで実行できる標準の実装を提供します(したがって、より速く簡単に記述できます)。

37
Quentin

.call()-指定された引数で同じ関数を呼び出します

.apply()-配列で指定された引数を使用して同じ関数を呼び出します

.bind()-this(最初の引数)のプリセット値を使用して、同じ関数本体で新しい関数を作成し、その関数を返します。

すべての場合において、最初の引数は関数内のthisの値として使用されます。

33
techfoobar

違いは、電話をかける方法です。 bindを使用して、this値がバインドされた関数を取得した場合は、関数を呼び出すだけです。

getx();

バインドされた関数がなく、thisを設定する場合は、callまたはapplyを使用して設定します。

someFunction.call(objectToUseAsThis, arg1, arg2);
// or
someFunction.apply(objectToUseAsThis, [arg1, arg2]);

バインドされた関数(getXなど)がある場合、callを使用しても意味がないことに注意してください。指定したthisは、バインドされたthisによってオーバーライドされるだけです。 (引数としてassしたい値の配列がある場合、applyを使用すると便利な場合があります。)

5
T.J. Crowder