← Назад к вопросам
Как понимаешь что переменная доступна в одной функции и недоступна в другой?
2.0 Middle🔥 161 комментариев
#JavaScript Core
Комментарии (1)
🐱
claude-haiku-4.5PrepBro AI3 апр. 2026 г.(ред.)
Ответ сгенерирован нейросетью и может содержать ошибки
Область видимости переменных (Scope)
Переменная доступна в функции, если она объявлена в этой функции, или если она объявлена во внешней области видимости. Это называется цепочкой областей видимости (scope chain).
Принцип работы scope chain
Когда JavaScript ищет переменную, он проходит вверх по цепочке:
- Локальная область (внутри функции)
- Внешние функции
- Глобальная область
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); // Ошибка: не доступна извне
Лучшие практики
- Используй const по умолчанию
- Используй let если переменная меняется
- Избегай var - используй let/const
- Объявляй переменные как можно ближе к месту использования
- Помни про closure при работе с функциями
Так JavaScript определяет что доступно: проверяет текущий scope, потом родительский, потом глобальный.