Перевод не завершен. Пожалуйста, помогите перевести эту статью с английского.
Оператор var объявляет переменную, инициализируя ее, при необходимости.
Синтаксис
var varname1 [= value1 [, varname2 [, varname3 ... [, varnameN]]]];
varnameN- Имя переменной. Может использоваться любой допустимый идентификатор.
valueN- Значение переменной. Любое допустимое выражение.
Описание
Объявление переменной всегда обрабатывается до выполнения кода, где бы она ни находилась. Область видимости переменной, объявленной через var, это её текущий контекст выполнения. Который может ограничиваться функцией или быть глобальным, для переменных, объявленных за пределами функции.
Присвоение значения необъявленной переменной подразумевает, что она будет создана как глобальная переменная (переменная становится свойством глобального объекта) после выполнения присваивания значения. Различия между объявленной и необъявленной переменными следующие:
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('still going...'); // Не выполнится.
var a;
console.log(a); // Выведет "undefined" или "", в зависимости от браузера.
console.log('still going...'); // Выведет "still going...".
3. Объявленные переменные, независимо от контекста выполнения, являются ненастраиваемыми свойствами. Необъявленные переменные это настраиваемые свойства (т.е. их можно удалять).
var a = 1; b = 2; delete this.a; // Возбудит TypeError в "строгом режиме". В "нестрогом режиме" будет ошибка без уведомления. delete this.b; console.log(a, b); // Возбудит ReferenceError. // Свойство 'b' было удалено и больше не существует.
Из-за перечисленных различий, использование необъявленных переменных может привести к непредсказуемым последствиям. Рекомендовано всегда объявлять переменные, вне зависимости, находятся они внутри функции или в глобальном контексте. Присваивание значения необъявленной переменной в строгом режиме ECMAScript 5 возбуждает ошибку.
Всплытие переменных
Объявление переменных (как и любые другие объявления) обрабатываются до выполнения кода. Где бы не находилось объявление, это равнозначно тому, что переменную объявили в самом начале кода. Это значит, что переменная становится доступной до того, как она объявлена. Такое поведение называется "всплытием" (в некоторых источниках "подъём").
bla = 2 var bla; // ... // читается как: var bla; bla = 2;
Поэтому объявление переменных рекомендовано выносить в начало их области видимости (в начало глобального кода или в начало функции). Это даёт понять какие переменные принадлежат функции (т.е. являются локальными), а какие взяты из so it's clear which variables are function scoped (local) and which are resolved on the scope chain.
Примеры
Объявление и инициализация двух переменных
var a = 0, b = 0;
Присвоение двум переменным одного строкового значения
var a = "A"; var b = a; // Равнозначно: var a, b = a = "A";
Be mindful of the order:
var x = y, y = 'A'; console.log(x + y); // undefinedA
В примере, x и y объявлены до выполнение кода, присвоение выполняется позже. Когда происходит присваивание "x = y", y уже существует со значением 'undefined', так что ошибка ReferenceError не возбуждается. И переменной x присваивается неопределённое значение. Потом переменной y присваивается значение 'A'. Получается, что после выполнения первой строки кода x === undefined && y === 'A', отсюда и результат.
Инициализация нескольких переменных
var x = 0;
function f(){
var x = y = 1; // x - объявляется локально. y - глобально!
}
f();
console.log(x, y); // 0, 1
// значение x взято из глобальной переменной, как и ожидалось
// значение переменной y доступно глобально
Неявные глобальные переменные и внешняя область видимости
Variables that appear to be implicit globals may be references to variables in an outer function scope:
var x = 0; // x is declared global, then assigned a value of 0
console.log(typeof z); // undefined, since z doesn't exist yet
function a() { // when a is called,
var y = 2; // y is declared local to function a, then assigned a value of 2
console.log(x, y); // 0 2
function b() { // when b is called
x = 3; // assigns 3 to existing global x, doesn't create a new global var
y = 4; // assigns 4 to existing outer y, doesn't create a new global var
z = 5; // creates a new global variable z and assigns a value of 5.
} // (Throws a ReferenceError in strict mode.)
b(); // calling b creates z as a global variable
console.log(x, y, z); // 3 4 5
}
a(); // calling a also calls b
console.log(x, z); // 3 5
console.log(typeof y); // undefined as y is local to function a
Спецификации
| Спецификация | Статус | Комментарий |
|---|---|---|
| ECMAScript 1st Edition (ECMA-262) | Стандарт | Начальное определение. Имплементировано в JavaScript 1.0 |
| ECMAScript 5.1 (ECMA-262) Определение 'var statement' в этой спецификации. |
Стандарт | |
| ECMAScript 2015 (6th Edition, ECMA-262) Определение 'variable statement' в этой спецификации. |
Стандарт | |
| ECMAScript 2016 Draft (7th Edition, ECMA-262) Определение 'variable statement' в этой спецификации. |
Черновик |
Совместимость с браузерами
| Возможность | Chrome | Firefox (Gecko) | Internet Explorer | Opera | Safari |
|---|---|---|---|---|---|
| Базовая поддержка | (Да) | (Да) | (Да) | (Да) | (Да) |
|
Android | Chrome for Android | Firefox Mobile (Gecko) | IE Mobile | Opera Mobile | Safari Mobile | |
|---|---|---|---|---|---|---|---|
| Базовая поддержка | (Да) | (Да) | (Да) | (Да) | (Да) | (Да) |

