From 218934fa2ed1c702a6d3923d2aa2cc6b43c48684 Mon Sep 17 00:00:00 2001 From: Peter Bengtsson Date: Tue, 8 Dec 2020 14:43:23 -0500 Subject: initial commit --- .../javascript/reference/statements/var/index.html | 226 +++++++++++++++++++++ 1 file changed, 226 insertions(+) create mode 100644 files/uk/web/javascript/reference/statements/var/index.html (limited to 'files/uk/web/javascript/reference/statements/var') diff --git a/files/uk/web/javascript/reference/statements/var/index.html b/files/uk/web/javascript/reference/statements/var/index.html new file mode 100644 index 0000000000..5044c8cfc5 --- /dev/null +++ b/files/uk/web/javascript/reference/statements/var/index.html @@ -0,0 +1,226 @@ +--- +title: var +slug: Web/JavaScript/Reference/Statements/var +tags: + - JavaScript + - Довідка + - Оператор +translation_of: Web/JavaScript/Reference/Statements/var +--- +
{{jsSidebar("Заяви")}}
+ +

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

+ +
{{EmbedInteractiveExample ("pages/js/statement-var.html")}}
+ + + +

Синтаксис

+ +
var varname1 [= value1] [, varname2 [= value2] … [, varnameN [= valueN]]] ;
+ +
+
varnameN
+
Ім'я змінної. Може бути будь-яким дозволеним ідентифікатором.
+
+ +
+
valueN
+
Початкове значення змінної. Може бути будь-яким дозволеним виразом. Якщо відсутнє, початковим значенням буде undefined.
+
+ +

Опис

+ +

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

+ +

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

+ +

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

+ +

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

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

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

+ +
console.log(a); // викидає ReferenceError
+console.log('виконання триває…');  // ніколи не виконається
+
+ +
var a;
+console.log(a); // "undefined" чи "", залежно від переглядача
+console.log('виконання триває…'); // виконання триває…
+ +

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

+ +
var a = 1;
+b = 2;
+
+delete this.а;  // у строгому режимі викидає TypeError, поза ним просто не спрацьовує
+delete this.b;
+
+console.log(a, b);  // викидає ReferenceError
+// Властивість 'b' була видалена й більше не існує.
+ +

Через ці відмінності використання неоголошених змінних, ймовірно, матиме несподівані наслідки. Тож, рекомендується завжди оголошувати змінні, незалежно від того, чи розташовані вони всередині функціі, чи у глобальній області видимості. У строгому режимі ECMAScript 5 присвоєння у неоголошену змінну викидає помилку.

+ +

Підняття var

+ +

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

+ +
bla = 2;
+var bla;
+
+// ...неявно означає таке:
+
+var bla;
+bla = 2;
+ +

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

+ +

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

+ +
function do_something() {
+  console.log(bar);  // undefined
+  var bar = 111;
+  console.log(bar);  // 111
+}
+
+// ...неявно означає таке:
+
+function do_something() {
+  var bar;
+  console.log(bar);  // undefined
+  bar = 111;
+  console.log(bar);  // 111
+}
+ +

Приклади

+ +

Оголошення та ініціалізація двох змінних

+ +
var a = 0, b = 0;
+ +

Присвоєння двом змінним одного рядкового значення

+ +
var a = 'А';
+var b = a;
+
+// ...те саме, що й:
+
+var a, b = a = 'А';
+ +

Зважайте на порядок:

+ +
var x = y, y = 'А';
+console.log(x, y);  // undefinedА
+ +

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

+ +

Ініціалізація кількох змінних

+ +
var x = 0;
+function f() {
+  var x = y = 1; // Оголошує x локально; оголошує y глобально.
+}
+
+f();
+
+console.log (x, y); // 0 1
+
+// У нестрогому режимі:
+// глобальна змінна x, як і очікувалось;
+// Але змінна y просочилась за межі функції!
+ +

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

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

Неявні глобальні змінні та область видимості зовнішньої функції

+ +

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

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

Специфікації

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
СпецифікаціяСтатусКоментар
{{SpecName ('ES1')}}{{Spec2('ES1')}}Початкова виознака. Запроваджено у JavaScript 1.0.
{{SpecName ('ES5.1', '#sec-12.2', 'var statement')}}{{Spec2('ES5.1')}}
{{SpecName ('ES6', '#sec-variable-statement', 'variable statement')}}{{Spec2('ES6')}}
{{SpecName ('ESDraft', '#sec-variable-statement', 'variable statement')}}{{Spec2('ESDraft')}}
+ +

Підтримка веб-переглядачами

+ + + +

{{Compat ("javascript.statements.var")}}

+ +

Див. також

+ + -- cgit v1.2.3-54-g00ecf