var

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

Синтаксис

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

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

Специфікація Статус Коментар
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 AndroidFirefox for AndroidOpera for AndroidSafari on iOSSamsung InternetNode.js
varChrome Full support 1Edge Full support 12Firefox Full support 1IE Full support 3Opera Full support YesSafari Full support YesWebView Android Full support 1Chrome Android Full support 18Firefox Android Full support 4Opera Android Full support YesSafari iOS Full support YesSamsung Internet Android Full support 1.0nodejs Full support Yes

Legend

Full support  
Full support

Див. також