--- title: Function.prototype.call() slug: Web/JavaScript/Reference/Global_Objects/Function/call translation_of: Web/JavaScript/Reference/Global_Objects/Function/call ---
Il metodo call()
esegue una funzione con un dato valore this
e argomenti passati singolarmente.
Note: Mentre la sintassi di questa funzione è quasi identica a quella di {{jsxref("Function.prototype.apply", "apply()")}}, la differenza fondamentale è che call()
accetta una lista di argomenti mentre apply()
accetta un singolo array di argomenti.
func.call([thisArg[, arg1, arg2, ...argN]])
thisArg
{{optional_inline}}Il valore da usare come this
quando si esegue func
.
Attenzione: In certi casi, thisArg
potrebbe non essere il valore reale visto dal metodo.
Se il metodo è una funzione in {{jsxref("Strict_mode", "non-strict mode", "", 1)}}, {{jsxref("Global_Objects/null", "null")}} e {{jsxref("Global_Objects/undefined", "undefined")}} sarà sostituito dall'oggetto globale e i valori di tipo primitiva verranno convertiti in oggetti.
arg1, arg2, ...argN
{{optional_inline}}Il risultato dell'esecuzione della funzione con il this
e gli argomenti specificati.
Il metodo call()
consente a una funzione/metodo appartenente a un oggetto di essere essere assegnata e chiamata per un oggetto diverso..
call()
fornisce un nuova valore di this
alla funzione/metodo. Con call()
, si può scrivere un metodo una volta ed ereditarlo in un altro oggetto senza dover riscrivere il metodo per il nuovo oggetto.
call
per collegare costruttori per un oggettoSi può usare call
per collegare costruttori per un oggetto (simile a Java).
Nell'esempio seguente, il costruttore per l'oggetto Product
è definito con 2 parametri: name
e price
.
Due altre funzioni, Food
e Toy
, invocano Product
, passando this
, name
, e price
. Product
inizializza le proprietà name
e price
. Entrambe le funzioni specializzate definiscono la category
.
function Product(name, price) { this.name = name; this.price = price; } function Food(name, price) { Product.call(this, name, price); this.category = 'food'; } function Toy(name, price) { Product.call(this, name, price); this.category = 'toy'; } const cheese = new Food('feta', 5); const fun = new Toy('robot', 40);
call
per invocare una funzione anonimaIn questo esempio, viene create una funzione anonima e usato call
per invocarla su ogni oggetto di un array.
Lo scopo principale della funzione anonima qui è di aggiungere una funzione print
o ogni oggetto il quale è in grado di stampare il corretto indice dell'oggetto nell'array.
Passare l'oggetto come valore this
non è strettamente necessario ma è fatto a scopo esplicativo.
const animals = [ { species: 'Lion', name: 'King' }, { species: 'Whale', name: 'Fail' } ]; for (let i = 0; i < animals.length; i++) { (function(i) { this.print = function() { console.log('#' + i + ' ' + this.species + ': ' + this.name); } this.print(); }).call(animals[i], i); }
call
per invocare una funzione e specificare il contesto per 'this
'Nell'esempio sotto, quando viene eseguita greet
, il valore di this
verrà legato all'oggetto obj
.
function greet() { const reply = [this.animal, 'typically sleep between', this.sleepDuration].join(' '); console.log(reply); } const obj = { animal: 'cats', sleepDuration: '12 and 16 hours' }; greet.call(obj); // cats typically sleep between 12 and 16 hours
call
per invocare una funzione senza specificare il primo parametroNell'esempio sotto, viene invocata la funzione display
senza passare il primo parametro. Se il primo parametro non è passato il valore di this
è legato all'oggetto globale.
var sData = 'Wisen'; function display() { console.log('sData value is %s ', this.sData); } display.call(); // sData value is Wisen
Attenzione: In strict mode il valore di this
sarà undefined
. Vedere sotto.
'use strict'; var sData = 'Wisen'; function display() { console.log('sData value is %s ', this.sData); } display.call(); // Cannot read the property of 'sData' of undefined
Specifiche |
---|
{{SpecName('ESDraft', '#sec-function.prototype.call', 'Function.prototype.call')}} |
{{Compat("javascript.builtins.Function.call")}}