var і = 10;
і = "ten";
3.9.1 Повторные и опущенные объявления
С помощью инструкции var МОЖНО объявить одну и ту же переменную несколько раз. Если повторное объявление содержит инициализатор, то оно действует как обычная инструкция присваивания.
Если попытаться прочитать значение необъявленной переменной, JavaScript сгенерирует ошибку. В строгом режиме, предусмотренном стандартом ECMAScript 5 (раздел 5.7.3), ошибка также возбуждается при попытке присвоить значение необъявленной переменной. Однако исторически и при выполнении не в строгом режиме, если присвоить значение переменной, не объявленной с помощью инструкции var, то JavaScript создаст эту переменную как свойство глобального объекта, и она будет действовать практически так же (но с некоторыми отличиями, описываемыми в разделе 3.10.2), как корректно объявленная переменная. Это означает, что глобальные переменные можно не объявлять. Однако это считается дурной привычкой и может явиться источником ошибок, поэтому всегда старайтесь объявлять свои переменные с помощью var.
3.10. Область видимости переменной
Область видимости (scope) переменной - это та часть программы, для которой эта переменная определена. Глобальная переменная имеет глобальную область видимости - она определена для всей JavaScript-программы. В то же время переменные, объявленные внутри функции, определены только в ее теле. Они называются локальными и имеют локальную область видимости. Параметры функций также считаются локальными переменными, определенными только в теле этой функции.
Внутри тела функции локальная переменная имеет преимущество перед глобальной переменной с тем же именем. Если объявить локальную переменную или параметр функции с тем же именем, что у глобальной переменной, то фактически глобальная переменная будет скрыта:
var scope = "global"; // Объявление глобальной переменной
function checkscope() {
var scope = "local"; // Объявление локальной переменной с тем же именем
return scope; // Вернет локальное значение, а не глобальное
}
checkscope() // => "local"
Объявляя переменные с глобальной областью видимости, инструкцию var можно опустить, но при объявлении локальных переменных всегда следует использовать инструкцию var. Посмотрите, что получается, если этого не сделать:
scope = "global";// Объявление глобальной переменной, даже без var.
function checkscope2() {
scope = "local"; // Ой! Мы изменили глобальную переменную.
myscope = "local"; // Неявно объявляется новая глоб. переменная.
return [scope, myscope];// Вернуть два значения.
checkscope2() // => ["local", "local"]: имеется побочный эффект!
scope // => "local": глобальная переменная изменилась.
myscope // => "local": нарушен порядок в глобальном пространстве имен.
Определения функций могут быть вложенными. Каждая функция имеет собственную локальную область видимости, поэтому может быть несколько вложенных уровней локальных областей видимости. Например:
var scope = "global scope"; // Глобальная переменная
function checkscopeO {
var scope = "local scope”; // Локальная переменная
function nestedO {
var scope = "nested scope"; // Вложенная область видимости локальных переменных
return scope; // Вернет значение этой переменной scope
}
return nested();
}
3.10.1. Область видимости функции и подъем
В некоторых С-подобных языках программирования каждый блок программного кода внутри фигурных скобок имеет свою собственную область видимости, а переменные, объявленные внутри этих блоков, невидимы за их пределами. Эта особенность называется областью видимости блока, но она не поддерживается в языке JavaScript. Вместо этого в JavaScript используется такое понятие, как область видимости функции: переменные, объявленные внутри функции, доступны внутри функции, где они объявлены, а также внутри всех функций, вложенных в эту функцию.