Function.prototype.call()

Метод call() викликає функцію із вказаним значенням this та зазначеним переліком аргументів.

Заувага: Хоча за своїм призначенням цей метод і apply() є тотожними, аргументи для викликаної функції передаються в дещо різний спосіб: метод call() приймає їх перелік, тоді як метод apply() приймає їх масив.

Синтаксис

function.call(thisArg[, arg1[, arg2[, ...]]])

Параметри

thisArg Optional
Значення this, яке буде застосовано для виклику function. Зауважте, що значення thisArg може зазнати перетворень — якщо функція function виконується у поблажливому режимі, тоді замість null та undefined буде застосовано глобальний об'єкт, а прості величини буде обернено на об'єкти.
arg1, arg2, ... Optional
Аргументи, що їх буде передано до функції function.

Вертає

Значення, яке внаслідок виклику повернула сама функція function.

Опис

Метод call() здійснює виклик функції, заступаючи значення ключового слова this всередині неї значенням, переданим до call() як перший аргумент. Це уможливлює одноразове написання деякої функції з можливістю її надалі викликати для всякого об'єкта так, наче вона є його методом.

Приклади

Виклик успадкованих конструкторів за допомогою call

Методом call() можна скористатись для створення ланцюжка конструкторів об'єкта, як у Java. У наведеному прикладі конструктор Product (виріб) має два параметри: назву (name) й ціну (price). Два інші конструктори — Food (їжа) і Toy (цяцька) — спершу викликають конструктор Product, передаючи потрібні йому значення name і price, а відтак додають окрему властивість 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';
}

var cheese = new Food('feta', 5);
var fun = new Toy('robot', 40);

Виклик неназваних функцій за допомогою метода call

Цей суто надуманий приклад містить використання метода call для виклику анонімної функції на кожному об'єкті з масиву.

Всередині цієї анонімної функції кожен об'єкт отримує окремий метод print, що друкуватиме значення властивостей об'єкта та його розташунок (індекс) в масиві. Передача об'єкта саме як this не є необхідністю, а вжито лише задля наочності.

var animals = [
  { species: 'Лев', name: 'Король' },
  { species: 'Пантера', name: 'Багіра' }
];

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

Виклик функції та перевиознака this за допомогою метода call

Під час виклику функції greet в цьому прикладі значення this буде прив'язано до об'єкта obj:

function greet() {
  var message = 'Вітаємо, ' + (this.isMale ? 'пане ' : 'пані ') + this.name;
  console.log(message);
}

var obj = {
  isMale: false, name: 'Олено'
};

greet.call(obj);  // Вітаємо, пані Олено

Виклик функції за допомогою метода call без зазначення першого аргумента

Як засвідчує цей приклад, відсутність першого аргумента метода call має наслідком прив'язування this до глобального об'єкта:

var name = 'Тарас';

var x = {
  name: 'Микола',
  display: function() {
    console.log('Мене звуть ' + this.name);
  }
};

x.display();  // Мене звуть Микола
x.display.call();  // Мене звуть Тарас

Специфікації

Специфікація Статус Коментар
ECMAScript 1st Edition (ECMA-262) Standard Початкова виознака. Запроваджено у JavaScript 1.3.
ECMAScript 5.1 (ECMA-262)
The definition of 'Function.prototype.call' in that specification.
Standard
ECMAScript 2015 (6th Edition, ECMA-262)
The definition of 'Function.prototype.call' in that specification.
Standard
ECMAScript (ECMA-262)
The definition of 'Function.prototype.call' in that specification.
Living Standard

Підтримка веб-переглядачами

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

Див. також