2011-09-01 20 views
8

Tengo una pregunta sobre 'llamar' en javascript.¿Cómo funciona 'call' en javascript?

var humanWithHand = function(){ 
    this.raiseHand = function(){ 
     alert("raise hand"); 
    } 
} 

var humanWithFoot = function(){ 
    this.raiseFoot = function(){ 
     alert("raise foot"); 
    } 
} 

var human = function(){ 

    humanWithHand.call(this); 
    humanWithFoot.call(this); 

} 

var test = new human(); 

so..when utilizo 'llamada' como humanWithHand.call (este), lo que ocurre internamente?

¿tiene humanWithHand copias variables (o puntos?) Sus propiedades y miembros para el prototipo de la variable humana?

+0

[Llamada de documentación de MDN()] (https://developer.mozilla.org/en/JavaScript/Reference/Global_Objects/Function/call) – epascarello

Respuesta

7

.call() establece el valor this y luego llama a la función con los argumentos que se pasan a .call(). Utiliza .call() en lugar de simplemente llamar a la función directamente cuando desea establecer el valor this dentro de la función llamada en lugar de dejarlo establecer en lo que javascript lo establezca normalmente.

.apply() es una función hermana. También puede establecer el valor this y puede tomar argumentos en una matriz para que se pueda usar cuando se intenta pasar una lista de argumentos variables desde otra llamada a función o cuando se está construyendo una lista de argumentos mediante programación que puede tener diferentes números de argumentos dependiendo de la situación.

9

Yehuda Katz tiene a good writeup del método de JavaScript Function#call. Su descripción debe responder a su pregunta, y muchas preguntas de seguimiento además.

Cuando se llama a una función directamente, usando la sintaxis general:

var foo = function() { 
    console.log("foo"); 
    return this; 
}; 
foo(); // evaluates to `window` 

Entonces this dentro de la llamada a la función es lo this está fuera de la llamada a la función. De forma predeterminada, en el navegador, this fuera de cualquier llamada de función es window. Por lo tanto, dentro de la llamada de función como se indica anteriormente, this también es por defecto window.

Cuando se llama a una función utilizando la sintaxis método de llamada:

var bar = { 
    foo: function() { 
    console.log("foo"); 
    return this; 
    } 
}; 
bar.foo(); // evaluates to `bar` 

Entonces this dentro de la llamada a la función es el objeto a la izquierda del punto más a la derecha: en este caso, bar.

Podemos simular esta situación usando call.

Cuando se configura una función fuera un objeto y desea llamar con this dentro de la llamada a la función se establece en un objeto, puede:

var foo = function() { 
    console.log("foo"); 
    return this; 
} 
var bar = { }; 
foo.call(bar); // evaluates to `bar` 

Puede utilizar esta técnica para pasar argumentos, así:

var foo = function(arg1, arg2) { 
    console.log("foo"); 
    return arg1 + arg2; 
} 
var bar = { }; 
foo.call(bar, "abc", "xyz"); // evaluates to `"abcxyz"` 
+0

Explicación excelente –