Function.prototype.call()

Questa traduzione è incompleta. Aiutaci a tradurre questo articolo dall’inglese

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 apply(), la differenza fondamentale è che call() accetta una lista di argomenti mentre apply() accetta un singolo array di argomenti.

Sintassi

func.call([thisArg[, arg1, arg2, ...argN]])

Parametri

thisArg Optional

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 non-strict mode, null e undefined sarà sostituito dall'oggetto globale e i valori di tipo primitiva verranno convertiti in oggetti.

arg1, arg2, ...argN Optional
Argomenti per la funzione.

Valore restituito

Il risultato dell'esecuzione della funzione con il this e gli argomenti specificati.

Descrizione

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.

Esempi

Usare call per collegare costruttori per un oggetto

Si 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);

Usare call per invocare una funzione anonima

In 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);
}

Usare 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

Usare call per invocare una funzione senza specificare il primo parametro

Nell'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

Specifiche
ECMAScript (ECMA-262)
The definition of 'Function.prototype.call' in that specification.

Browser compatibility

Update compatibility data on GitHub
DesktopMobileServer
ChromeEdgeFirefoxInternet ExplorerOperaSafariAndroid webviewChrome for AndroidFirefox for AndroidOpera for AndroidSafari on iOSSamsung InternetNode.js
callChrome Full support 1Edge Full support 12Firefox Full support 1IE Full support 5.5Opera Full support 4Safari Full support 1WebView Android Full support 1Chrome Android Full support 18Firefox Android Full support 4Opera Android Full support 10.1Safari iOS Full support 1Samsung Internet Android Full support 1.0nodejs Full support Yes

Legend

Full support  
Full support

See also