Pregunta

Estoy leyendo aplicaciones web de JavaScript, de O'Reilly. En varios puntos del libro, el autor usa algo a lo largo de lo siguiente:

instance.init.apply(instance, arguments);

¿Tiene esto algún sentido? ¿No es esto exactamente lo mismo que:

instance.init(arguments);

.call () y .Apply () se utilizan para establecer manualmente el contexto de ejecución de una función. ¿Por qué debería usarlos cuando tengo la intención de usar el contexto de ejecución original de todos modos?

¿Fue útil?

Solución

El caso es que arguments es un objeto similar a una matriz. Haciendo ...

instance.init(arguments);

... pasa un argumento, que es un objeto similar a una matriz que contiene ciertos argumentos. Por otro lado, haciendo ...

instance.init.apply(instance, arguments);

... pasará el objeto similar a la matriz Como argumentos separados. Es cierto que la configuración instance es algo inútil porque ya lo escribiste, pero si usas .apply simplemente necesitas establecer el this valor también.

Un ejemplo rápido de la diferencia:

function log(a, b, c) {
    console.log(a, b, c);
}

function log2() {
    log.apply(null, arguments); // `this` value is not meaningful here,
                                // it's about `arguments`
}

function log3() {
    log(arguments);
}

log(1, 2, 3);  // logs:  1, 2, 3

log2(1, 2, 3); // logs:  1, 2, 3

log3(1, 2, 3); // logs:  <Arguments>, undefined, undefined
               //        where <Arguments> contains the values 1, 2, 3

Otros consejos

El uso de aplicar () en ese ejemplo asegura que 'esta' === instancia, en lugar de domwindow if instance.init () se ejecuta a partir de otra función/expresión.

var x = function(){ debugger; },
    y = function(){ x.apply(x, arguments); },
    z = function() { x(arguments); };

y("abc", true, []); // this === x
z("abc", true, []); // this === DOMWindow

Simplemente está especificando el contexto.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top