Метод 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 Latest Draft (ECMA-262)
The definition of 'Function.prototype.call' in that specification.
Draft  

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

Update compatibility data on GitHub
DesktopMobileServer
ChromeEdgeFirefoxInternet ExplorerOperaSafariAndroid webviewChrome for AndroidEdge MobileFirefox for AndroidOpera for AndroidiOS SafariSamsung InternetNode.js
Basic supportChrome Full support YesEdge Full support YesFirefox Full support 1IE Full support YesOpera Full support YesSafari Full support YesWebView Android Full support YesChrome Android Full support YesEdge Mobile Full support YesFirefox Android Full support 4Opera Android Full support YesSafari iOS Full support YesSamsung Internet Android Full support Yesnodejs Full support Yes

Legend

Full support  
Full support

Див. також

Мітки документа й учасники

Мітки: 
Зробили внесок у цю сторінку: asmforce, piton13
Востаннє оновлена: asmforce,