aboutsummaryrefslogtreecommitdiff
path: root/files/uk/web/javascript/reference/global_objects/function/call/index.html
blob: caa12e71b0bb2b19e9f4ed53ff6e6e23f14bcb1d (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
---
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
---
<div>{{JSRef}}</div>

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

<div class="note">
<p><strong>Заувага:</strong> Хоча за своїм призначенням цей метод і {{jsxref("Function.prototype.apply", "apply()")}} є тотожними, аргументи для викликаної функції передаються в дещо різний спосіб: метод <code>call()</code> приймає їх <strong>перелік</strong>, тоді як метод <code>apply()</code> приймає їх <strong>масив</strong>.</p>
</div>

<div>{{EmbedInteractiveExample("pages/js/function-call.html")}}</div>

<p class="hidden">Першокод цього прикладу збережено у репозиторії GitHub. Якщо ви хочете долучитися до створення чи поліпшення таких прикладів, пропонуйте нам свої зміни до репозиторію <a href="https://github.com/mdn/interactive-examples">https://github.com/mdn/interactive-examples</a>.</p>

<h2 id="Синтаксис">Синтаксис</h2>

<pre class="syntaxbox"><code><var>function</var>.call(<var>thisArg</var>[, <var>arg1</var>[, <var>arg2</var>[, ...]]])</code></pre>

<h3 id="Параметри">Параметри</h3>

<dl>
 <dt><code>thisArg</code> {{optional_inline}}</dt>
 <dd>Значення <code>this</code>, яке буде застосовано для виклику <code>function</code>. Зауважте, що значення <code>thisArg</code> може зазнати перетворень — якщо функція <code>function</code> виконується у {{jsxref("Functions_and_function_scope/Strict_mode", "поблажливому режимі", "", 1)}}, тоді замість {{jsxref("Global_Objects/null", "null")}} та {{jsxref("Global_Objects/undefined", "undefined")}} буде застосовано {{glossary("Global_object", "глобальний об'єкт")}}, а {{glossary("Primitive", "прості величини")}} буде обернено на об'єкти.</dd>
 <dt><code>arg1, arg2, ...</code> {{optional_inline}}</dt>
 <dd>Аргументи, що їх буде передано до функції <code>function</code>.</dd>
</dl>

<h3 id="Вертає">Вертає</h3>

<p>Значення, яке внаслідок виклику повернула сама функція <code>function</code>.</p>

<h2 id="Опис">Опис</h2>

<p>Метод <code>call()</code> здійснює виклик функції, заступаючи значення ключового слова <code>this</code> всередині неї значенням, переданим до <code>call()</code> як перший аргумент. Це уможливлює одноразове написання деякої функції з можливістю її надалі викликати для всякого об'єкта так, наче вона є його методом.</p>

<h2 id="Приклади">Приклади</h2>

<h3 id="Виклик_успадкованих_конструкторів_за_допомогою_call">Виклик успадкованих конструкторів за допомогою <code>call</code></h3>

<p>Методом <code>call()</code> можна скористатись для створення ланцюжка конструкторів об'єкта, як у Java. У наведеному прикладі конструктор <code>Product</code> (виріб) має два параметри: назву (<code>name</code>) й ціну (<code>price</code>). Два інші конструктори — <code>Food</code> (їжа) і <code>Toy</code> (цяцька) — спершу викликають конструктор <code>Product</code>, передаючи потрібні йому значення <code>name</code> і <code>price</code>, а відтак додають окрему властивість <code>category</code> (різновид).</p>

<pre class="brush: js">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);
</pre>

<h3 id="Виклик_неназваних_функцій_за_допомогою_метода_call">Виклик неназваних функцій за допомогою метода <code>call</code></h3>

<p>Цей суто надуманий приклад містить використання метода <code>call</code> для виклику анонімної функції на кожному об'єкті з масиву.</p>

<p>Всередині цієї анонімної функції кожен об'єкт отримує окремий метод <code>print</code>, що друкуватиме значення властивостей об'єкта та його розташунок (індекс) в масиві. Передача об'єкта саме як <code>this</code> не є необхідністю, а вжито лише задля наочності.</p>

<pre class="brush: js">var animals = [
  { species: 'Лев', name: 'Король' },
  { species: 'Пантера', name: 'Багіра' }
];

for (var i = 0; i &lt; animals.length; i++) {
  (function(i) {
    this.print = function() {
      console.log(i, this.species, this.name);
    }
    this.print();
  }).call(animals[i], i);
}
</pre>

<h3 id="Виклик_функції_та_перевиознака_this_за_допомогою_метода_call">Виклик функції та перевиознака <code>this</code> за допомогою метода <code>call</code></h3>

<p>Під час виклику функції <code>greet</code> в цьому прикладі значення <code>this</code> буде прив'язано до об'єкта <code>obj</code>:</p>

<pre class="brush: js">function greet() {
  var message = 'Вітаємо, ' + (this.isMale ? 'пане ' : 'пані ') + this.name;
  console.log(message);
}

var obj = {
  isMale: false, name: 'Олено'
};

greet.call(obj);  // Вітаємо, пані Олено
</pre>

<h3 id="Виклик_функції_за_допомогою_метода_call_без_зазначення_першого_аргумента">Виклик функції за допомогою метода <code>call</code> без зазначення першого аргумента</h3>

<p>Як засвідчує цей приклад, відсутність першого аргумента метода <code>call</code> має наслідком прив'язування <code>this</code> до {{glossary('global object', 'глобального об\'єкта')}}:</p>

<pre class="brush: js">var name = 'Тарас';

var x = {
  name: 'Микола',
  display: function() {
    console.log('Мене звуть ' + this.name);
  }
};

x.display();  // Мене звуть Микола
x.display.call();  // Мене звуть Тарас
</pre>

<h2 id="Специфікації">Специфікації</h2>

<table class="standard-table">
 <tbody>
  <tr>
   <th scope="col">Специфікація</th>
   <th scope="col">Статус</th>
   <th scope="col">Коментар</th>
  </tr>
  <tr>
   <td>{{SpecName('ES1')}}</td>
   <td>{{Spec2('ES1')}}</td>
   <td>Початкова виознака. Запроваджено у JavaScript 1.3.</td>
  </tr>
  <tr>
   <td>{{SpecName('ES5.1', '#sec-15.3.4.4', 'Function.prototype.call')}}</td>
   <td>{{Spec2('ES5.1')}}</td>
   <td></td>
  </tr>
  <tr>
   <td>{{SpecName('ES6', '#sec-function.prototype.call', 'Function.prototype.call')}}</td>
   <td>{{Spec2('ES6')}}</td>
   <td></td>
  </tr>
  <tr>
   <td>{{SpecName('ESDraft', '#sec-function.prototype.call', 'Function.prototype.call')}}</td>
   <td>{{Spec2('ESDraft')}}</td>
   <td></td>
  </tr>
 </tbody>
</table>

<h2 id="Підтримка_веб-переглядачами">Підтримка веб-переглядачами</h2>

<div class="hidden">Таблиця сумісності на цій сторінці створена зі структурованих даних. Якщо ви хочете долучитися до розробки цих даних, пропонуйте нам свої pull request до репозиторію <a href="https://github.com/mdn/browser-compat-data">https://github.com/mdn/browser-compat-data</a>.</div>

<div>{{Compat("javascript.builtins.Function.call")}}</div>

<h2 id="Див._також">Див. також</h2>

<ul>
 <li>{{jsxref("Function.prototype.bind()")}}</li>
 <li>{{jsxref("Function.prototype.apply()")}}</li>
 <li>
  <p><a href="/uk/docs/Learn/JavaScript/Objects">Вступ до об'єктів JavaScript</a></p>
 </li>
</ul>