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関数は同じですか?
bind
は、元の関数のように機能しますが、this
が事前定義されている関数を返します。これは通常、イベントハンドラーまたはその他の非同期コールバックに関数を渡したい場合に使用されます。
call
とapply
は関数をすぐに呼び出し、this
の値と関数が受け取る引数の両方を指定できます。
2番目の例では、apply
を呼び出す無名関数を定義しています。これは一般的なパターンです。 bind
は、単純な関数呼び出しで実行できる標準の実装を提供します(したがって、より速く簡単に記述できます)。
.call()
-指定された引数で同じ関数を呼び出します
.apply()
-配列で指定された引数を使用して同じ関数を呼び出します
.bind()
-this
(最初の引数)のプリセット値を使用して、同じ関数本体で新しい関数を作成し、その関数を返します。
すべての場合において、最初の引数は関数内のthis
の値として使用されます。
違いは、電話をかける方法です。 bind
を使用して、this
値がバインドされた関数を取得した場合は、関数を呼び出すだけです。
getx();
バインドされた関数がなく、this
を設定する場合は、call
またはapply
を使用して設定します。
someFunction.call(objectToUseAsThis, arg1, arg2);
// or
someFunction.apply(objectToUseAsThis, [arg1, arg2]);
バインドされた関数(getX
など)がある場合、call
を使用しても意味がないことに注意してください。指定したthis
は、バインドされたthis
によってオーバーライドされるだけです。 (引数としてassしたい値の配列がある場合、apply
を使用すると便利な場合があります。)