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

Синтаксис

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

Опис

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

Повторне оголошення змінної в JavaScript не скидає її значення:

var x = 1;
var x;

console.log(x);  // виводить 1

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

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);  // виводить 1
console.log(b);  // викидає ReferenceError

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

Першість оголошень

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

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

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 = 'xyz';
var b = a;

// Те саме, що й:

var a, b = a = 'xyz';

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

var x = y, y = 'xyz';
console.log(x, y);  // виводить undefined "xyz"

Спершу відбувається оголошення x та y, а тоді призначення. Під час обчислення "x = y" змінна y вже існує (тому ReferenceError не викидається), але початкового значення їй ще не надано. Отже, змінна x дістане значення undefined перш ніж змінній y буде призначено "xyz".

Започаткування кількох змінних

var x = 0;

function f() {
  // Зважте, що тут оголошується місцева змінна x, але не y!
  var x = y = 1;
}

f();

// В суворому режимі викидає ReferenceError (у не оголошено)
// Поза суворим режимом виводить 0, 1
console.log (x, y);

Глобальна та зовнішня області видимості

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

var x = 0;  // змінну х оголошено в межах файлу, початкове значення 0

(typeof z);  // undefined, позаяк z ще не існує

function foo() {
  var y = 2;  // оголошено в межах функції foo з початковим значенням 2

  console.log (x, y);  // виводить 0 2 

  function bar() {
    x = 3;  // звертання до оголошеної в межах файлу змінної x
    у = 4;  // звертання до оголошеної у функції foo змінної y

    // Викидає ReferenceError в суворому режимі:
    z = 5;  // створення глобальної змінної z з початковим значенням 5
  }

  bar();  // виклик bar створює змінну z в глобальній області видимості
  console.log(x, y, z);  // виводить 3 4 5 
}

foo();  // зсередини foo також викликається bar
console.log(x, z);  // виводить 3 5 
console.log(typeof y);  // undefined бо змінна y була оголошена всередині foo

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

Специфікація Статус Коментар
ECMAScript 1st Edition (ECMA-262) Standard Початкова виознака. Запроваджено у JavaScript 1.0.
ECMAScript 5.1 (ECMA-262)
The definition of 'var statement' in that specification.
Standard  
ECMAScript 2015 (6th Edition, ECMA-262)
The definition of 'variable statement' in that specification.
Standard  
ECMAScript Latest Draft (ECMA-262)
The definition of 'variable statement' in that specification.
Draft  

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

Update compatibility data on GitHub
DesktopMobileServer
ChromeEdgeFirefoxInternet ExplorerOperaSafariAndroid webviewChrome for AndroidEdge MobileFirefox for AndroidOpera for AndroidSafari on iOSSamsung InternetNode.js
Basic supportChrome Full support YesEdge Full support YesFirefox Full support 1IE Full support YesOpera Full support YesSafari Full support YesWebView Android Full support YesChrome Android Full support YesEdge Mobile Full support YesFirefox Android Full support 4Opera Android Full support YesSafari iOS Full support YesSamsung Internet Android Full support Yesnodejs Full support Yes

Legend

Full support  
Full support

Див. також

Мітки документа й учасники

Мітки: 
Зробили внесок у цю сторінку: asmforce, OlexandrIlchenko
Востаннє оновлена: asmforce,