Книга: Выразительный JavaScript
Вложенные области видимости
Вложенные области видимости
JavaScript различает не только глобальные и локальные переменные. Функции можно задавать внутри функций, что приводит к нескольким уровням локальности.
К примеру, следующая довольно бессмысленная функция содержит внутри ещё две:
var landscape = function() {
var result = "";
var flat = function(size) {
for (var count = 0; count < size; count++)
result += "_";
};
var mountain = function(size) {
result += "/";
for (var count = 0; count < size; count++)
result += "'";
result += "";
};
flat(3);
mountain(4);
flat(6);
mountain(1);
flat(1);
return result;
};
console.log(landscape());
// ? ___/''''______/'_
Функции flat
и mountain
видят переменную result
, потому что они находятся внутри функции, в которой она определена. Но они не могут видеть переменные count
друг друга, потому что переменные одной функции находятся вне области видимости другой. А окружение снаружи функции landscape
не видит ни одной из переменных, определённых внутри этой функции.
Короче говоря, в каждой локальной области видимости можно увидеть все области, которые её содержат. Набор переменных, доступных внутри функции, определяется местом, где эта функция описана в программе. Все переменные из блоков, окружающих определение функции, видны – включая и те, что определены на верхнем уровне в основной программе. Этот подход к областям видимости называется лексическим.
Люди, изучавшие другие языки программирования, могут подумать, что любой блок, заключённый в фигурные скобки, создаёт своё локальное окружение. Но в JavaScript область видимости создают только функции. Вы можете использовать отдельно стоящие блоки:
var something = 1;
{
var something = 2;
// Делаем что-либо с переменной something...
}
// Вышли из блока...
Но something
внутри блока – это та же переменная, что и снаружи. Хотя такие блоки и разрешены, имеет смысл использовать их только для команды if
и циклов.
Если это кажется вам странным – так кажется не только вам. В версии JavaScript 1.7 появилось ключевое слово let
, которое работает как var
, но создаёт переменные, локальные для любого данного блока, а не только для функции.
- 2.12.2. Анализ усилительных каскадов в области малых времен
- Настройка верхней области навигации
- Создание дочерней рабочей области
- Создание рабочей области для документов
- Удаление рабочей области для документов
- Создание рабочей области для собраний с использованием шаблона
- Создание рабочей области для собраний на основе календарного события
- Использование домашней страницы рабочей области для собраний
- 2. Нормативно-правовая база, государственное регулирование и координация в области ВЯД
- Из области уведомлений вдруг пропадают значки запущенных программ
- ВЛОЖЕННЫЕ СТРУКТУРЫ
- 8.1.1. Вложенные функции