Что такое область видимости — и почему переменная «not defined», хотя вот же она

Знакомая сцена. Попросил ИИ поправить функцию, запускаешь — и красная строка:
ReferenceError: total is not defined
Открываешь код, а total — вот она, объявлена пятью строчками выше. Чёрным по белому. Код врёт?
Нет. Переменная есть — просто ты стоишь не в той комнате. Это и называется область видимости, и после этой статьи ты будешь находить такие ошибки глазами за секунды.
Что такое область видимости
Область видимости (по-английски scope) — это участок кода, где переменная существует. Вне этого участка её нет. Совсем.
Лучшая аналогия — дом с комнатами. Записка, оставленная на кухне, лежит на кухне. Из коридора её не прочитать. А вот из кухни прекрасно видно всё, что висит в коридоре.
В коде «комнаты» обозначают фигурные скобки { }. Всё, что объявлено внутри пары скобок, живёт только внутри неё:
if (cart.length > 0) {
const total = sum(cart) // total родилась здесь
}
console.log(total) // ReferenceError: total is not defined
total объявили внутри блока if. Блок закрылся — переменная исчезла. Строчка снаружи ищет её и не находит.
Как устроены «комнаты»
Правило одно, и оно работает во всех направлениях: изнутри видно наружу, снаружи внутрь — нет.
const appName = "KODiQ" // коридор: видно всем
function greet(user) {
const hello = "Привет" // комната функции
if (user) {
const text = hello + ", " + user // внутренняя комната
console.log(text, appName) // видит всё: и hello, и appName
}
console.log(text) // ошибка: text осталась во внутренней комнате
}
Три уровня — и у каждого своя видимость:
- Глобальная — то, что объявлено на самом верху файла. Видно отовсюду.
- Функции — всё внутри
functionили стрелочной функции. Снаружи не видно. - Блока — всё внутри
if,for,whileи любых фигурных скобок. Если объявлено черезletилиconst.
Последняя оговорка важная. Старое ключевое слово var правилу блоков не подчиняется — оно «протекает» наружу из if и for. Именно поэтому в современном коде его почти не встретишь, а ИИ пишет let или const.
Почему это спасает, а не мешает
Кажется, что область видимости — лишнее препятствие. На деле она защищает от худшего хаоса.
Представь, что все переменные видно везде. В проекте на сорок файлов есть двадцать переменных i, десяток data и пять result. Любая функция могла бы случайно перезаписать чужую. Баг в одном конце приложения выстреливал бы в другом.
Область видимости делает так, что data в одной функции и data в соседней — это две разные вещи. Каждая комната со своими записками. Можно спокойно называть переменные коротко — они не столкнутся.
Как находить такую ошибку за секунды
Когда видишь is not defined, а переменная в коде есть, сделай три шага:
- Найди, где она объявлена. Ищи
const имя,let имяили параметр функции. - Найди её фигурные скобки. Встань курсором на открывающую
{над объявлением — редактор подсветит парную закрывающую. Всё между ними — дом переменной. - Проверь, где падает. Если строчка с ошибкой снаружи этих скобок — вот и причина.
Чинится обычно одним из двух способов: вынести объявление на уровень выше, туда, откуда видно обоим местам, или вернуть значение из функции через return и забрать его снаружи.
Это частая поломка именно в коде от ИИ. Модель правит кусок, перекладывает строчку внутрь if или в другую функцию — и не замечает, что кто-то снаружи на неё рассчитывал. Поэтому, когда проверяешь код от ИИ, смотри на скобки вокруг переменных, которые переехали.
Что такое замыкание и при чём тут область видимости?
Замыкание — это функция, которая «помнит» переменные комнаты, где её создали, даже когда её вызывают снаружи. Это прямое следствие области видимости: функция берёт с собой ключ от своей комнаты.
Это то же самое, что scope у MCP-серверов или токенов?
Слово одно, смысл родственный: «где это действует». У токенов доступа scope — это набор разрешений, у настроек — где они применяются. Но в коде scope — всегда про видимость переменных.
Можно просто объявить всё глобально, чтобы не мучиться?
Можно, но это та самая ловушка «всё видно везде». Работает на ста строчках и превращается в клубок на тысяче. Держи переменную в самой маленькой комнате, где она нужна.
Короткие уроки-истории, симулятор агента и ежедневная практика — в нашем мобильном приложении. Бесплатно.





