2011-10-19 15 views
13

Tengo una aplicación de JavaScript que usa muchas devoluciones de llamada. Una función típica tomará una devolución de llamada y la envolverá con otra devolución de llamada.¿Cuándo debería usar call() frente a invocar la función directamente?

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

Teniendo en cuenta el ejemplo anterior, cuando debe una configuración tal que nos la call() método nativo (pasando el resultado var como segundo argumento) en vez de invocar their_on_success() y pasando el resultado a través de la invocación de la función?

Respuesta

19

llamada() se utiliza para cambiar el este valor de la función:

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

La única razón para usar call (o apply) es si desea establecer el valor de this dentro de la función .

Bueno, supongo que apply puede ser útil en otros casos, ya que acepta una matriz de parámetros.

+1

El caso principal para 'apply' es cuando se trata de argumentos variables, por lo que puede simplemente pasarle' arguments'. –

3

Utilizando el método de una función call() le permite cambiado el objeto que está destinado a la función como this durante la ejecución de la función - esto también se le llama el contexto

their_on_success.call(myContext, results) 

Pero, si la función de devolución de llamada no depende de this, no importa en qué dirección lo llame.

3

Un buen ejemplo es cuando se implementa una función que necesita una devolución de llamada. Al escribir código OO, desea permitir que la persona que llama especifique el contexto al que se llamará una devolución de llamada.

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

Tenga en cuenta que mi ejemplo simplemente se podría implementar pasando el parámetro de contexto de la llamada $.ajax, pero que no le mostraría mucho más acerca del uso de call

1

Otro caso para el uso de la llamada() es cuando se encuentra en un entorno en el que no puede confiar en que el método del objeto no haya sido reemplazado o que sepa que en realidad no tiene el método que desea ejecutar en él. hasOwnProperty suele ser un método así: hay muchos lugares donde los objetos JavaScript pueden no tener su propio método hasOwnProperty, así que invocarlo como hasOwnProperty.call (obj, propertyName) es prudente.

+1

Entiendo lo que dices, pero creo que se puede mejorar. Algo así como: JavaScript le permite especificar ningún prototipo ('Object.create (null)'), anula las propiedades en los prototipos de objetos nativos, o incluso en el objeto mismo. Por lo tanto, para estar seguro, uno debe usar 'Object.prototype.hasOwnProperty.call (obj, 'someProp')' para que su código sea a prueba de balas. –

Cuestiones relacionadas