32
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 関数は同じですか?

4

3 に答える 3

39

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

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

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

于 2013-03-28T09:02:31.360 に答える
34

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

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

.bind()this- (最初の引数) の事前設定値を使用して、同じ関数本体で新しい関数を作成し、その関数を返します。

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

于 2013-03-28T09:02:57.647 に答える
5

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

getx();

バインドされた関数がなく、 を設定したい場合は、 orthisを使用して行います。callapply

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

あなたがバインドされた関数(あなたのようなgetX)を持っている場合、それを使用callすることは無意味であることに注意してください。(引数として代入したい値の配列がある場合、使用は依然として有用かもしれません。)thisthisapply

于 2013-03-28T09:03:15.887 に答える