2011-10-19 11 views
13

Ho un'applicazione JavaScript che utilizza molte callback. Una funzione tipica richiederà una richiamata e la avvolgerà con un altro callback.Quando dovrei usare call() o invocare direttamente la funzione?

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); 
}; 

Dato l'esempio precedente, quando dovrebbero un tale noi setup call() metodo nativo (passando il risultato var come secondo argomento) anziché invocare their_on_success() e passando il risultato tramite funzione invocazione?

risposta

19

call() viene utilizzato per modificare la questo valore della funzione:

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

L'unica ragione per usare call (o apply) è se si desidera impostare il valore della this all'interno della funzione .

Bene, immagino che apply possa essere utile in altri casi in quanto accetta un array di parametri.

+1

Il caso principale per 'apply' è quando si ha a che fare con argomenti variabili, quindi è sufficiente passare' arguments' ad esso. –

3

Usando il metodo call() di una funzione consente di cambiato l'oggetto che è legato alla funzione come this durante l'esecuzione della funzione - questo è anche chiamata la contesto

their_on_success.call(myContext, results) 

Ma, se la funzione di callback non dipende da this, non fa alcuna differenza in quale modo lo chiami.

3

Un buon esempio è quando si implementa una funzione che richiede una richiamata. Quando si scrive codice OO, si desidera consentire al chiamante di specificare il contesto in cui verrà richiamato un callback.

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

Si noti che il mio esempio potrebbe semplicemente essere implementato passando il parametro di contesto alla chiamata $.ajax, ma che non sarebbe mostrerà molto sull'utilizzo call

1

Un altro caso per l'utilizzo di call() è quando si si trovano in un ambiente in cui non ci si può fidare del fatto che il metodo dell'oggetto non sia stato sostituito o che non abbia effettivamente il metodo che si desidera eseguire su di esso. hasOwnProperty è spesso un tale metodo - ci sono molti posti in cui gli oggetti javascript potrebbero non avere il proprio metodo hasOwnProperty in modo da invocarlo come hasOwnProperty.call (obj, propertyName) è prudente.

+1

Ricevo quello che stai dicendo, ma penso che possa essere migliorato. Qualcosa di simile: JavaScript consente di non specificare alcun prototipo ('Object.create (null)'), sovrascrivere le proprietà sui prototipi di oggetti nativi o anche sull'oggetto stesso. Pertanto, per sicurezza, si dovrebbe usare 'Object.prototype.hasOwnProperty.call (obj, 'someProp')' perché il tuo codice sia a prova di proiettile. –