aboutsummaryrefslogtreecommitdiff
path: root/files/uk/web/javascript/reference/statements/var/index.html
blob: 5044c8cfc5c178277f4fc6f0b128aa30fd10d2b8 (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
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
---
title: var
slug: Web/JavaScript/Reference/Statements/var
tags:
  - JavaScript
  - Довідка
  - Оператор
translation_of: Web/JavaScript/Reference/Statements/var
---
<div><font><font><font><font>{{jsSidebar("Заяви")}}</font></font></font></font></div>

<p><font><font><strong><font><font>Оператор <code>var</code></font></font></strong><font><font> оголошує змінну, з необов'язковим наданням їй початкового значення.</font></font></font></font></p>

<div><font><font><font><font>{{EmbedInteractiveExample ("pages/js/statement-var.html")}}</font></font></font></font></div>

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

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

<pre class="syntaxbox"><font><font><font><font>var </font></font></font></font><em><font><font><font><font>varname1 [</font></font></font></font></em><font><font><font><font>= </font></font></font></font><em><font><font><font><font>value1] [</font></font></font></font></em><font><font><font><font>, </font></font></font></font><em><font><font><font><font>varname2 [</font></font></font></font></em><font><font><font><font>= </font></font></font></font><em><font><font><font><font>value2] …</font></font></font></font></em><em><font><font><font><font> [</font></font></font></font></em><font><font><font><font>, </font></font></font></font><em><font><font><font><font>varnameN [</font></font></font></font></em><font><font><font><font>= </font></font></font></font><em><font><font><font><font>valueN]]]</font></font></font></font></em><font><font><font><font> ;</font></font></font></font></pre>

<dl>
 <dt><code>varnameN</code></dt>
 <dd><font><font><font><font>Ім'я змінної. Може бути </font></font></font><font><font><font>будь-яким дозволеним ідентифікатором.</font></font></font></font></dd>
</dl>

<dl>
 <dt><code>valueN</code></dt>
 <dd><font><font><font><font>Початкове значення змінної. Може бути будь-яким дозволеним виразом. </font></font></font><font><font><font>Якщо відсутнє, початковим значенням буде <em>undefined</em></font></font></font></font><font><font><font><font>.</font></font></font></font></dd>
</dl>

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

<p><font><font><font><font>Оголошення змінних через <code>var</code> обробляються до виконання будь-якого коду. Це називається підняттям, і обговорюється нижче.</font></font></font></font></p>

<p><font><font><font><font>Область видимості змінної, що її оголошено оператором <code>var</code>, залежить від <em>контексту виконання</em>, це або замикаюча функція, або — якщо змінну оголошено поза межами всіх функцій — глобальний контекст</font></font></font></font><font><font><font><font></font></font></font></font><font><font><font><font>Повторне оголошення змінної у JavaScript не скидає її значення.</font></font></font></font></p>

<p><font><font><font><font>Присвоєння значення неоголошеній змінній просто створює її як глобальну змінну (вона стає властивістю глобального об'єкта) під час виконання присвоєння. Відмінності між оголошеними та неоголошеними змінними наступні:</font></font></font></font></p>

<p><font><font><font><font>1. Оголошені змінні обмежені контекстом виконання, в якому їх оголошено. </font></font></font><font><font><font>Неоголошені змінні завжди глобальні.</font></font></font></font></p>

<pre class="brush: js"><font><font><font><font>function x() {
  y = 1;  // у строгому режимі викидає ReferenceError
  var z = 2;
}</font></font></font></font>
<font><font><font><font>
x();</font></font></font></font>
<font><font><font><font>
console.log(y);  </font></font></font><font><font><font>// 1</font></font></font></font><font><font><font><font>
console.log(z);  </font></font></font><font><font><font>// викидає ReferenceError: z не визначено за межами x</font></font></font></font></pre>

<p><font><font><font><font>2. Оголошені змінні створюються до виконання будь-якого коду. Н</font><font>еоголошені </font></font></font><font><font><font>не існують до виконання коду, що присвоює їм значення.</font></font></font></font></p>

<pre class="brush: js"><font><font><font><font>console.log(a); </font></font></font><font><font><font>// викидає ReferenceError
console.log('виконання триває…');  // ніколи не виконається</font></font></font></font>
</pre>

<pre class="brush: js"><font><font><font><font>var a;
console.log(a); // "undefined" чи "", залежно від переглядача
console.log('виконання триває…'); // виконання триває…</font></font></font></font></pre>

<p><font><font><font><font>3. Оголошені змінні є недоступними для налаштування властивостями свого контексту виконання (функціонального чи глобального). </font></font></font><font><font><font>Неоголошені змінні доступні для налаштування (наприклад, їх можна видалити).</font></font></font></font></p>

<pre class="brush: js">var a = 1;
b = 2;

delete this.а;  // у строгому режимі викидає TypeError, поза ним просто не спрацьовує
delete this.b;

console.log(a, b);  // викидає ReferenceError
// Властивість 'b' була видалена й більше не існує.</pre>

<p><font><font>Через ці відмінності використання неоголошених змінних, ймовірно, матиме несподівані наслідки. </font><font>Тож, </font></font><strong><font><font>рекомендується завжди оголошувати змінні, незалежно від того, чи розташовані вони всередині функціі, чи у глобальній області видимості. </font></font></strong><font><font>У </font></font><a href="/uk/docs/Web/JavaScript/Reference/Strict_mode"><font><font>строгому режимі</font></font></a><font><font> ECMAScript 5</font><font> присвоєння у неоголошену змінну викидає помилку.</font></font></p>

<h3 id="Підняття_var">Підняття var</h3>

<p><font><font>Позаяк оголошення змінних (та й оголошення загалом) обробляються до виконанням будь-якого коду, оголошення змінної будь-де у коді є тотожним оголошенню на його початку. Це також означає, що змінну можна використовувати до того, як вона була оголошена. </font></font><font><font>Ця поведінка називається «підняттям», бо виглядає так, наче оголошення було пересунуто на початок функції чи глобального коду. </font></font></p>

<pre class="brush: js"><font><font>bla = 2;</font></font><font><font>
var bla;</font></font><font><font>
</font></font><font><font>
// ...неявно означає таке:</font></font>
<font><font>
var bla;</font></font><font><font>
bla = 2;</font></font></pre>

<p><font><font>З цієї причини рекомендується завжди оголошувати змінні нагорі їхньої області видимості (на початку тіла функції чи глобального коду), бо так легше зрозуміти, котра змінна належить до області видимості функції (локальна), а яка обчислюється через ланцюжок областей видимості.</font></font></p>

<p><font><font>Важливо зазначити, що підняття стосується оголошення змінної, але не її ініціалізації. Початкове значення дійсно буде присвоєне по виконанні відповідного рядка</font><font>:</font></font></p>

<pre class="brush: js"><font><font><font><font>function</font></font> do_something() {
  console.log(bar);  // undefined</font></font><font><font>
  var bar = 111;
  console.log(bar);  // 111
}</font></font>

<font><font>// ...неявно означає таке:</font></font>

<font><font>function</font></font> do_something() {
  var bar;
  console.log(bar);  // undefined
  bar = 111;
  console.log(bar);  // 111
}</pre>

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

<h3 id="Оголошення_та_ініціалізація_двох_змінних"><font><font>Оголошення та ініціалізація двох змінних</font></font></h3>

<pre class="brush: js"><font><font>var a = 0, b = 0;</font></font></pre>

<h3 id="Присвоєння_двом_змінним_одного_рядкового_значення"><font><font>Присвоєння двом змінним одного рядкового значення</font></font></h3>

<pre class="brush: js"><font><font>var a = 'А';</font></font><font><font>
var b = a;</font></font>
<font><font>
// ...те саме, що й:</font></font>
<font><font>
var a, b = a = 'А';</font></font></pre>

<p><font><font>Зважайте на порядок:</font></font></p>

<pre class="brush: js"><font><font>var x = y, y = 'А';</font></font><font><font>
console.log(x, y);  </font><font>// undefinedА</font></font></pre>

<p><font><font>Тут </font></font><code>x</code> та<font><font> </font></font><code>y</code> оголошуються до виконання коду, але присвоєння значень відбувається пізніше<font><font>. </font><font>Під час обчислення "</font></font><code>x = y</code><font><font>" змінна </font></font><code>y</code><font><font> вже існує, тому </font></font><code>ReferenceError</code> <font><font>не викидається, а її значенням є <code>undefined</code></font></font><font><font>. </font><font>Отже, змінна </font></font><code>x</code> <font><font>дістане значення <code>undefined</code></font></font><font><font>. Далі змінній <code>y</code> присвоюється значення <code>'А'</code>. Отже, після першого рядка <code>x === undefined &amp;&amp; y === 'A'</code>, звідси результат.</font></font></p>

<h3 id="Ініціалізація_кількох_змінних"><font><font>Ініціалізація кількох змінних</font></font></h3>

<pre class="brush: js"><font><font>var x = 0;</font></font>
<font><font>function f() {
  var x = y = 1; // Оголошує x локально; оголошує y глобально.
}</font></font>

f();

<font><font>console.log (x, y); // 0 1

// У нестрогому режимі:
// глобальна змінна x, як і очікувалось;
// Але змінна y просочилась за межі функції!</font></font></pre>

<p>Той самий приклад, але у строгому режимі:</p>

<pre class="brush: js">'use strict';

var x = 0;
function f() {
  var x = y = 1; // Викидає ReferenceError у строгому режимі.
}
f();

console.log(x, y);</pre>

<h3 id="Неявні_глобальні_змінні_та_область_видимості_зовнішньої_функції"><font><font>Неявні глобальні змінні та область видимості зовнішньої функції</font></font></h3>

<p>Змінні, що виглядають неявними глобальними змінними, можуть бути посиланнями на змінні області видимості зовнішньої функції:</p>

<pre class="brush: js"><font><font><font><font>var x = 0;  // оголошує змінну х в межах файлу та присвоює їй значення 0</font></font></font></font>
<font><font><font><font>
console.log(typeof z);  </font></font></font><font><font><font>// "undefined", позаяк змінна z ще не існує</font></font></font></font>
<font><font><font><font>
function a() {</font></font></font></font><font><font><font><font>
  var y = 2;  </font></font></font><font><font><font>// Оголошує змінну y в області видимості функції a, та присвоює їй значення 2</font></font></font></font>
<font><font><font><font>
  console.log (x, y);  </font></font></font><font><font><font>// 0 2 </font></font></font></font>
<font><font><font><font>
  function b() {
    x = 3;  // Присвоює 3 оголошеній в межах файлу змінній x.
    у = 4;  // Присвоює 4 оголошеній зовнішній змінній y.
    z = 5;  // Створює нову глобальну змінну z та присвоює їй значення 5.
            // (Викидає ReferenceError у строгому режимі.)
  }</font></font></font></font>
<font><font><font><font>
  b();  </font></font></font><font><font><font>// Створює змінну z в глобальній області видимості.</font></font></font></font><font><font><font><font>
  console.log(x, y, z);  </font></font></font><font><font><font>// 3 4 5 </font></font></font></font><font><font><font><font>
</font></font></font></font>}
<font><font><font><font>
a();  </font></font></font><font><font><font>// Також викликає b.
console.log(x, z);  // 3 5
console.log(typeof y);  // "undefined", бо y є локальною змінною функції a</font></font></font></font></pre>

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

<table class="standard-table">
 <tbody>
  <tr>
   <th scope="col"><font><font><font><font>Специфікація</font></font></font></font></th>
   <th scope="col"><font><font><font><font>Статус</font></font></font></font></th>
   <th scope="col"><font><font><font><font>Коментар</font></font></font></font></th>
  </tr>
  <tr>
   <td><font><font><font><font>{{SpecName ('ES1')}}</font></font></font></font></td>
   <td><font><font><font><font>{{Spec2('ES1')}}</font></font></font></font></td>
   <td>Початкова виознака. Запроваджено у JavaScript 1.0.</td>
  </tr>
  <tr>
   <td><font><font><font><font>{{SpecName ('ES5.1', '#sec-12.2', 'var statement')}}</font></font></font></font></td>
   <td><font><font><font><font>{{Spec2('ES5.1')}}</font></font></font></font></td>
   <td></td>
  </tr>
  <tr>
   <td><font><font><font><font>{{SpecName ('ES6', '#sec-variable-statement', 'variable statement')}}</font></font></font></font></td>
   <td><font><font><font><font>{{Spec2('ES6')}}</font></font></font></font></td>
   <td></td>
  </tr>
  <tr>
   <td><font><font><font><font>{{SpecName ('ESDraft', '#sec-variable-statement', 'variable statement')}}</font></font></font></font></td>
   <td><font><font><font><font>{{Spec2('ESDraft')}}</font></font></font></font></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>

<p><font><font><font><font>{{Compat ("javascript.statements.var")}}</font></font></font></font></p>

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

<ul>
 <li>{{jsxref("Statements/let", "let")}}</li>
 <li>{{jsxref("Statements/const", "const")}}</li>
</ul>