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