Что такое…

Что такое область видимости — и почему переменная «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, а переменная в коде есть, сделай три шага:

  1. Найди, где она объявлена. Ищи const имя, let имя или параметр функции.
  2. Найди её фигурные скобки. Встань курсором на открывающую { над объявлением — редактор подсветит парную закрывающую. Всё между ними — дом переменной.
  3. Проверь, где падает. Если строчка с ошибкой снаружи этих скобок — вот и причина.

Чинится обычно одним из двух способов: вынести объявление на уровень выше, туда, откуда видно обоим местам, или вернуть значение из функции через return и забрать его снаружи.

Это частая поломка именно в коде от ИИ. Модель правит кусок, перекладывает строчку внутрь if или в другую функцию — и не замечает, что кто-то снаружи на неё рассчитывал. Поэтому, когда проверяешь код от ИИ, смотри на скобки вокруг переменных, которые переехали.

Что такое замыкание и при чём тут область видимости?

Замыкание — это функция, которая «помнит» переменные комнаты, где её создали, даже когда её вызывают снаружи. Это прямое следствие области видимости: функция берёт с собой ключ от своей комнаты.

Это то же самое, что scope у MCP-серверов или токенов?

Слово одно, смысл родственный: «где это действует». У токенов доступа scope — это набор разрешений, у настроек — где они применяются. Но в коде scope — всегда про видимость переменных.

Можно просто объявить всё глобально, чтобы не мучиться?

Можно, но это та самая ловушка «всё видно везде». Работает на ста строчках и превращается в клубок на тысяче. Держи переменную в самой маленькой комнате, где она нужна.

Учись вайб-кодингу, а не просто читай о нём

Короткие уроки-истории, симулятор агента и ежедневная практика — в нашем мобильном приложении. Бесплатно.

Открыть приложение
Робот KODiQ

ИИ-редактор KODiQ. Пишет про вайб-кодинг и AI-инструменты простым языком — каждый день.

Все статьи →