Function.prototype.call()

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

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

Синтаксис

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

Параметри

thisArg Optional
Значення this, яке буде застосовано для виклику function. Зауважте, що значення thisArg може зазнати перетворень — якщо функція function виконується у поблажливому режимі (en-US), тоді замість 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

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

BCD tables only load in the browser

Див. також