← Назад к вопросам

Как понимаешь что переменная доступна в одной функции и недоступна в другой?

2.0 Middle🔥 161 комментариев
#JavaScript Core

Комментарии (1)

🐱
claude-haiku-4.5PrepBro AI3 апр. 2026 г.(ред.)

Ответ сгенерирован нейросетью и может содержать ошибки

Область видимости переменных (Scope)

Переменная доступна в функции, если она объявлена в этой функции, или если она объявлена во внешней области видимости. Это называется цепочкой областей видимости (scope chain).

Принцип работы scope chain

Когда JavaScript ищет переменную, он проходит вверх по цепочке:

  1. Локальная область (внутри функции)
  2. Внешние функции
  3. Глобальная область
const global = 'Глобальная переменная';

function outer() {
  const outerVar = 'Переменная внешней функции';
  
  function inner() {
    const innerVar = 'Переменная внутренней функции';
    
    console.log(innerVar);  // Доступна: 'Переменная внутренней функции'
    console.log(outerVar);  // Доступна: 'Переменная внешней функции'
    console.log(global);    // Доступна: 'Глобальная переменная'
  }
  
  inner();
  console.log(innerVar);  // Ошибка: ReferenceError - не определена
}

outer();
console.log(outerVar);  // Ошибка: ReferenceError - не определена

Типы областей видимости

1. Глобальная область (Global scope)

Переменные объявлены вне функций, доступны везде:

var globalVar = 'Глобальная'; // избегай var
const globalConst = 'Константа';

function anyFunction() {
  console.log(globalVar); // Доступна
}

2. Функциональная область (Function scope)

Переменные объявлены внутри функции, доступны только в ней:

function myFunction() {
  const localVar = 'Локальная';
  let anotherLocal = 'Ещё локальная';
  
  console.log(localVar); // Доступна
}

console.log(localVar); // Ошибка: not defined

3. Блочная область (Block scope)

var НЕ имеет block scope, но let и const имеют:

if (true) {
  var varVariable = 'var';
  let letVariable = 'let';
  const constVariable = 'const';
}

console.log(varVariable);     // Доступна (function scope)
console.log(letVariable);     // Ошибка (block scope)
console.log(constVariable);   // Ошибка (block scope)

Closure - функции помнят внешний scope

function createCounter() {
  let count = 0; // Переменная в outer scope
  
  return function increment() {
    count++; // Доступна благодаря closure
    return count;
  };
}

const counter = createCounter();
console.log(counter()); // 1
console.log(counter()); // 2
console.log(count);     // Ошибка: не доступна извне

Лучшие практики

  1. Используй const по умолчанию
  2. Используй let если переменная меняется
  3. Избегай var - используй let/const
  4. Объявляй переменные как можно ближе к месту использования
  5. Помни про closure при работе с функциями

Так JavaScript определяет что доступно: проверяет текущий scope, потом родительский, потом глобальный.