MDN wants to talk to developers like you: https://qsurvey.mozilla.com/s3/a3e7b5301fea

Function.prototype.call()

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

Примітка: У той час, як синтаксис цієї функції є майже ідентичним до синтаксису apply(), основною відмінністю є те, що метод call() приймає список аргументів, тоді як метод apply() приймає єдиний масив аргументів.

Синтаксис

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

Параметри

thisArg
Значення this, яке передане для виклику в функцію (fun). Зазначте, що this може не бути фактичним значенням, яке видиме методом: якщо даний метод є функцією в строгому режимі (non-strict mode) коду, null і undefined будуть замінені глобальними об'єктами і значення-примітиви будуть зконвертовані в об'єкти.
arg1, arg2, ...
Аргументи для даного об'єкта.

Значення, яке повертається

Результат виконання даної функції з зазначеним значенням this і аргументами.

Опис

Інший об'єкт this може бути присвоєно, коли викликається існуюча функція. Значення this посилається на поточний об'єкт, а саме об'єкт, який викликається. З методом call, ви можете написати метод один раз і потім успадковувати його в іншому об'єкті без необхідності переписувати даний метод для нового об'єкта.

Приклади

Використання методу call для ланцюгового виконання конструкторів до об'єкта

Ви може використовувати метод call для ланцюгового виконання конструкторів до об'єкта, по аналогії з Java. В наступному прикладі, конструктор об'єкта Продукт(Product) визначений двома параметрами, ім'я (name) і ціна (price). Дві інші функції Їжа (Food) і Іграшка (Toy) викликають Продукт (Product) передаючи this, name і price. Об'єкт Product ініціалізує дані параметри name і price, обидві спеціалізовані функції визначають дану категорію (category).

function Product(name, price) {
  this.name = name;
  this.price = price;

  if (price < 0) {
    throw RangeError('Cannot create product ' +
                      this.name + ' with a negative 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: '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);
}

Використання методу call для виконання функції і визначення контексту 'this'

В нижче наведеному прикладі, коли ми будемо викликати функцію greet значення this буде прив'язуватися до об'єкта i.
 

function greet() {
  var reply = [this.person, 'Is An Awesome', this.role].join(' ');
  console.log(reply);
}

var i = {
  person: 'Douglas Crockford', role: 'Javascript Developer'
};

greet.call(i); // Douglas Crockford Is An Awesome Javascript Developer

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

Специфікація Статус Коментар
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 2017 Draft (ECMA-262)
The definition of 'Function.prototype.call' in that specification.
Draft  

Сумісність із браузерами

Особливість Chrome Firefox (Gecko) Internet Explorer Opera Safari
Базова підтримка (Yes) (Yes) (Yes) (Yes) (Yes)
Особливість Android Chrome for Android Firefox Mobile (Gecko) IE Mobile Opera Mobile Safari Mobile
Базова підтримка (Yes) (Yes) (Yes) (Yes) (Yes) (Yes)

Дивитися також

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

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