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

BCD tables only load in the browser

Veja também