Метод call()
викликає функцію із вказаним значенням this
та зазначеним переліком аргументів.
Заувага: Хоча за своїм призначенням цей метод і apply()
є тотожними, аргументи для викликаної функції передаються в дещо різний спосіб: метод call()
приймає їх перелік, тоді як метод apply()
приймає їх масив.
Першокод цього прикладу збережено у репозиторії GitHub. Якщо ви хочете долучитися до створення чи поліпшення таких прикладів, пропонуйте нам свої зміни до репозиторію https://github.com/mdn/interactive-examples.
Синтаксис
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 (ECMA-262) The definition of 'Function.prototype.call' in that specification. |
Living Standard |
Підтримка веб-переглядачами
BCD tables only load in the browser