Область видимости (scope) переменной – это та часть программы, для которойэта переменная определена. Глобальная переменная имеет глобальную область видимости – она определена для всей JavaScript_программы. Переменные, объ_ явленные внутри функции, определены только в ее теле. Они называются локаль' ными и имеют локальную область видимости. Параметры функций также счита_ются локальными переменными, определенными только в теле этой функции.
Внутри тела функции локальная переменная имеет преимущество перед гло_ бальной переменной с тем же именем. Если объявить локальную переменную или параметр функции с тем же именем, что у глобальной переменной, то фак_ тически глобальная переменная будет скрыта. Так, следующий код печатает слово «локальная»:
var scope = "глобальная"; // Объявление глобальной переменной
function checkscope() {
var scope = "локальная"; // Объявление локальной переменной с тем же именем
document.write(scope); // Используется локальная переменная, а не глобальная
}
checkscope(); // Печатается слово "локальная"
Объявляя переменные с глобальной областью видимости, инструкцию var мож_ но опустить, но при объявлении локальных переменных она необходима. По_ смотрите, что получается, если этого не сделать:
scope = "глобальная"; // Объявление глобальной переменной, даже без var
function checkscope() {
scope = "локальная"; // Ой! Мы только что изменили глобальную переменную
document.write(scope); // Используется глобальная переменная
myscope = "локальная"; // Здесь мы неявно объявляем новую глобальную переменную
document.write(myscope); // Используется новая глобальная переменная
}
checkscope(); // Печатает "локальнаялокальная"
document.write(scope); // Печатает "локальная"
document.write(myscope); // Печатает "локальная"
70 Глава 4. Переменные
Функции, как правило, не знают, какие переменные объявлены в глобальной области видимости или для чего они нужны. Поэтому функция, использующая глобальную переменную вместо локальной, рискует изменить значение, необхо_ димое какой_либо другой части программы. К счастью, избежать этой неприят_ ности легко: объявляйте все переменные с помощью инструкции var.
Определения функций могут быть вложенными. Каждая функция имеет собст_ венную локальную область видимости, поэтому может быть несколько вложен_ ных уровней локальных областей видимости. Например: