2011-09-01 4 views
8

Ho una domanda su "chiama" in javascript.Come funziona la "chiamata" in 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 Io uso 'chiamata' come humanWithHand.call (questo), cosa succede internamente?

fa humanWithHand copie variabili (o punti?) Delle sue proprietà e membri al prototipo della variabile umana?

+0

[Chiamata alla documentazione MDN()] (https://developer.mozilla.org/en/JavaScript/Reference/Global_Objects/Function/call) – epascarello

risposta

7

.call() imposta il valore this e poi chiama la funzione con gli argomenti che si passati al .call(). Si utilizza .call() invece di chiamare direttamente la funzione quando si desidera impostare il valore this all'interno della funzione chiamata anziché lasciare che sia impostato su qualsiasi javascript lo imposti normalmente.

.apply() è una funzione sorella. Può anche impostare il valore this e può assumere argomenti in un array in modo che possa essere utilizzato quando si tenta di passare un elenco di argomenti variabile da qualche altra chiamata di funzione o quando si sta costruendo un elenco di argomenti a livello di codice che potrebbe avere numeri diversi di argomenti a seconda della situazione.

9

Yehuda Katz ha a good writeup del metodo Function#call di JavaScript. La sua scrittura dovrebbe rispondere alla tua domanda e molte altre domande aggiuntive.

Quando si chiama una funzione direttamente, utilizzando la sintassi generale:

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

Poi this all'interno della chiamata di funzione è tutto ciò che è al di fuori this la chiamata di funzione. Per impostazione predefinita, nel browser, this all'esterno di qualsiasi funzione, le chiamate sono window. Quindi all'interno della chiamata di funzione come sopra, this è anche predefinito window.

Quando si chiama una funzione utilizzando la sintassi metodo di chiamata:

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

Poi this all'interno della chiamata di funzione è l'oggetto alla sinistra del periodo più a destra: in questo caso, bar.

Possiamo simulare questa situazione utilizzando call.

Quando si imposta una funzione di fuori di un oggetto e si desidera chiamare con this all'interno della chiamata di funzione impostata su un oggetto, è possibile:

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

È possibile utilizzare questa tecnica per passare gli argomenti così:

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

Grande spiegazione –