2011-10-19 8 views
13

多くのコールバックを使用するJavaScriptアプリケーションがあります。典型的な関数はコールバックをとり、別のコールバックでラップします。上記の例を考えるとcall()と関数を直接呼び出すのはいつ使うべきですか?

Namespace.foo = function(arg, their_on_success) { 
    var my_on_success = function(result) { 
     console.log('my_on_success() called'); 
     if('function' === typeof their_on_success) { 
       their_on_success(result); 
     } 
    } 
    something(arg, my_on_success); 
}; 

、ときではなくtheir_on_success()を呼び出し、関数呼び出しを経由して結果を渡すよりも、このようなセットアップたちネイティブcall()方法(第二引数として結果VARを渡す)する必要がありますか?あなたが関数内でthisの値を設定したい場合はcall(またはapply)を使用する

var obj = {a: 0}; 
method.call(obj, "parameter"); 
function method(para) { 
    this.a == 0; // true <-- obj is now this 
} 

答えて

19

呼び出しは()関数のこの値を変更するために使用されます。

まあ、applyは、パラメータの配列を受け入れるので、他の場合には便利だと思います。関数のcall()メソッドを使用して

7

唯一の理由です:

+1

'apply'の主なケースは、可変引数を扱うときです。そのため、単に' arguments'を渡すことができます。 –

3

あなたは、関数の実行中にthisとしての機能にバインドされたのオブジェクトを変更することができます - あなたのコールバック関数ならば、これはまた、コンテキスト

their_on_success.call(myContext, results) 

と呼ばれるがthisに依存していないので、あなたはそれをどのように呼んでも違いはありません。

3

良い例は、コールバックを必要とする関数を実装する場合です。 OOコードを書くときには、コールバックが呼び出されるコンテキストを呼び出し側が指定できるようにする必要があります。

function validateFormAjax(form, callback, context) { 
    // Using jQuery for simplicity 
    $.ajax({ 
    url: '/validateForm.php', 
    data: getFormData(form), 
    success: function(data) { 
     callback.call(context, data); 
    } 
    }); 
} 

私の例では、ちょうど$.ajaxコールにコンテキストパラメータを渡すことによって実装することができ、それがあなたに電話を(使用するためのcall

1

別のケースを使用してについて多くを示さないことに注意してください)したときでありますオブジェクトの独自のメソッドが置き換えられていないか、実際にそのメソッドを実行していないことがわかっている場合は、そのオブジェクトのメソッドを信頼できない環境に置かれています。 hasOwnPropertyはしばしばそのようなメソッドです - javascriptオブジェクトが独自のhasOwnPropertyメソッドを持たない場所がたくさんあるので、hasOwnProperty.call(obj、propertyName)として呼び出すことは賢明です。

+1

あなたの言っていることを得るが、改善できると思う。何かのように:JavaScriptでは、プロトタイプを一切指定しないで( 'Object.create(null)')、ネイティブオブジェクトのプロトタイプのプロパティをオーバーライドすることができます。したがって、安全のためには、あなたのコードが弾丸になるために 'Object.prototype.hasOwnProperty.call(obj、 'someProp')'を使うべきです。 –

関連する問題