Function.prototype.call()

O método call() realiza a chamada de uma função com o parâmetros this além de outros parâmetros fornecidos individualmente.

Sintaxe

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

Parâmetros

thisArg Optional
O valor de this fornecido ao chamar func.

Aviso: Em certos casos, thisArg pode não ser o valor que o método vê.

Se o método for uma função em non-strict mode, null e undefined são substituídos pelo objeto global, e valores primitivos são convertidos em objetos.

arg1, arg2, ...argN Optional
Parâmetros para a função.

Resultado

O resultado ao chamar a função em questão com os parâmetros this e os outros argumentos especificados.

Descrição

call() permite uma função / método pertencendo a um objeto, ser atribuída a outro objeto e ser chamada desse mesmo.

call() fornece um novo valor para this à função / método. Com call(), pode escrever um método uma vez, e depois herdar o método noutro objeto, sem ter de rescrever a função para o novo objeto.

Nota: Apesar de a sintaxe da função ser quase idêntica à da apply(), a principal diferença é que call() aceita uma lista de argumentos (arg1, arg2, ...argN), enquanto apply() aceita uma matriz de argumentos ([arg1, arg2, ...argN]).

Exemplos

Usar call para encadear construtores dum objeto

É possível utilizar call para encadear construtores para um objeto (como em Java).

No exemplo abaixo, o construtor para o objeto Product é definido com dois parâmetros: name e price.

Duas outras funções, Food e Toy, invocam Product passando os parâmetros thisname e price. As funções Food e Toy também definem a propriadade 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);

Usar call para invocar uma função anónima

Neste exemplo, criamos uma função anónima e utilizamos call para invocá-la em cada objeto na matriz.

O principal objetivo da função anónima é inserir a função print em cada objeto. A função print imprimir o índice do objeto na matriz em que se encontra.

Passar o objeto desta forma (como this) não é necessário, mas foi feito de forma a exemplificar a função.

var animals = [
  { species: 'Lion', name: 'King' },
  { species: 'Whale', name: 'Fail' }
];

for (var i = 0; i < animals.length; i++) {
  (function(i) {
    this.print = function() {
      console.log('#' + i + ' ' + this.species
                  + ': ' + this.name);
    }
    this.print();
  }).call(animals[i], i);
}

Usar call para invocar a função sem especificar o primeiro argumento

No exemplo abaixo, quando chamamos a função display sem passar o primeiro argumento. Se o primeiro argumento não é especificado, o objeto global é atribuído a this.
 

var sData = 'Wisen';

function display() {
  console.log('sData value is %s ', this.sData);
}

display.call();  // sData value is Wisen

Aviso: Em "strict mode", o valor de this é undefined, exemplificado em baixo.

'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

Especificações

Especificação
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

Veja também