Функциональная область видимости
Функциональная область видимости означает, что переменная, объявленная с помощью var внутри функции, доступна только внутри этой функции и во всех вложенных блоках — но не за пределами функции.
Пример:
function checkUser() {
var isLoggedIn = true;
if (isLoggedIn) {
var message = "Пользователь авторизован";
console.log(message); // работает — внутри if
}
console.log(message); // тоже работает — message доступна в функции
}
checkUser();
console.log(isLoggedIn); // ошибка: isLoggedIn is not defined
console.log(message); // ошибка: message is not defined
Здесь isLoggedIn и message видны только внутри функции checkUser. За её пределами — недоступны. Это защищает внешний код от случайных перезаписей.
Но есть важная особенность var: он не имеет блочной области видимости.
Даже если переменная объявлена внутри if, for или while — она всё равно будет доступна во всей функции.
Пример:
function processSettings() {
if (true) {
var theme = "dark";
}
console.log(theme); // "dark" — доступна, хотя объявлена внутри if
}
processSettings();
То же самое с циклом:
function loopExample() {
for (var i = 0; i < 3; i++) {
console.log(i);
}
console.log(i); // 3 — i доступна даже после цикла
}
loopExample();
Это поведение — особенность var. Он поднимается (hoisting) и привязывается к функции, а не к блоку {}.
Почему это проблема:
- Сложно отслеживать, где именно переменная была объявлена
- Можно случайно использовать переменную до её ожидаемого объявления
- Ведёт к ошибкам при рефакторинге
Поэтому в современном JavaScript var не рекомендуется. Вместо него используйте let и const — они дают блочную область видимости и предсказуемое поведение.