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"`
[Chiamata alla documentazione MDN()] (https://developer.mozilla.org/en/JavaScript/Reference/Global_Objects/Function/call) – epascarello