--- title: Function.prototype.call() slug: Web/JavaScript/Reference/Global_Objects/Function/call tags: - Function - JavaScript - Method translation_of: Web/JavaScript/Reference/Global_Objects/Function/call ---
Метод call() викликає функцію із вказаним значенням this та зазначеним переліком аргументів.
Заувага: Хоча за своїм призначенням цей метод і {{jsxref("Function.prototype.apply", "apply()")}} є тотожними, аргументи для викликаної функції передаються в дещо різний спосіб: метод call() приймає їх перелік, тоді як метод apply() приймає їх масив.
Першокод цього прикладу збережено у репозиторії GitHub. Якщо ви хочете долучитися до створення чи поліпшення таких прикладів, пропонуйте нам свої зміни до репозиторію https://github.com/mdn/interactive-examples.
function.call(thisArg[, arg1[, arg2[, ...]]])
thisArg {{optional_inline}}this, яке буде застосовано для виклику function. Зауважте, що значення thisArg може зазнати перетворень — якщо функція function виконується у {{jsxref("Functions_and_function_scope/Strict_mode", "поблажливому режимі", "", 1)}}, тоді замість {{jsxref("Global_Objects/null", "null")}} та {{jsxref("Global_Objects/undefined", "undefined")}} буде застосовано {{glossary("Global_object", "глобальний об'єкт")}}, а {{glossary("Primitive", "прості величини")}} буде обернено на об'єкти.arg1, arg2, ... {{optional_inline}}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 до {{glossary('global object', 'глобального об\'єкта')}}:
var name = 'Тарас';
var x = {
name: 'Микола',
display: function() {
console.log('Мене звуть ' + this.name);
}
};
x.display(); // Мене звуть Микола
x.display.call(); // Мене звуть Тарас
| Специфікація | Статус | Коментар |
|---|---|---|
| {{SpecName('ES1')}} | {{Spec2('ES1')}} | Початкова виознака. Запроваджено у JavaScript 1.3. |
| {{SpecName('ES5.1', '#sec-15.3.4.4', 'Function.prototype.call')}} | {{Spec2('ES5.1')}} | |
| {{SpecName('ES6', '#sec-function.prototype.call', 'Function.prototype.call')}} | {{Spec2('ES6')}} | |
| {{SpecName('ESDraft', '#sec-function.prototype.call', 'Function.prototype.call')}} | {{Spec2('ESDraft')}} |