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

Пользовался ли var в JavaScript

2.0 Middle🔥 142 комментариев
#JavaScript Core#Браузер и сетевые технологии

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

🐱
deepseek-v3.2PrepBro AI4 апр. 2026 г.(ред.)

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

Да, пользовался, но сегодня это антипаттерн

Да, безусловно, я пользовался var в JavaScript, особенно в начале моей карьеры и при работе с legacy-кодом. Однако в современной разработке (ES6+, с 2015 года) использование var считается устаревшей практикой и прямым антипаттерном. Его полностью вытеснили let и const. Понимание var критически важно для чтения старого кода и глубокого понимания языка, но для написания нового кода его следует избегать.

Ключевые проблемы var

Основные недостатки var проистекают из его устаревшей семантики:

1. Отсутствие блочной области видимости (Block Scope)

var имеет только область видимости уровня функции (Function Scope) или глобальную. Это приводит к неинтуитивному поведению внутри блоков if, for, while.

// Проблема с var
for (var i = 0; i < 5; i++) {
    setTimeout(() => console.log(i), 100); // Всегда выводит 5 пять раз
}
// Переменная i доступна и здесь! console.log(i); // 5

// Решение с let
for (let j = 0; j < 5; j++) {
    setTimeout(() => console.log(j), 100); // Корректно выводит 0, 1, 2, 3, 4
}
// console.log(j); // ReferenceError: j is not defined

2. Поднятие (Hoisting) с инициализацией undefined

Переменные, объявленные через var, поднимаются (hoisted) в начало своей области видимости и автоматически инициализируются значением undefined. Это может маскировать ошибки.

console.log(myVar); // undefined (нет ошибки, но значение неожиданное)
var myVar = 10;
console.log(myVar); // 10

// Поведение, эквивалентное движком:
var myVar; // hoisting: объявление поднято, инициализация в undefined
console.log(myVar); // undefined
myVar = 10; // Присваивание происходит здесь
console.log(myVar); // 10

3. Возможность повторного объявления

var позволяет повторно объявлять переменную в той же области видимости, что может привести к случайным перезаписям и сложностям в отладке.

var user = "Анна";
// ... 100 строк кода ...
var user = "Иван"; // Разрешено! Переменная user перезаписана.
console.log(user); // "Иван"

4. Автоматическое присоединение к глобальному объекту

При объявлении var в глобальной области видимости переменная становится свойством глобального объекта (window в браузере, global в Node.js < 15), что может приводить к конфликтам.

var globalConfig = { mode: 'test' };
console.log(window.globalConfig === globalConfig); // true в браузере

Чем заменить var? Правила выбора let и const

С появлением ES6 (ES2015) были введены let и const, которые имеют блочную область видимости и лишены перечисленных недостатков.

  • const: Используй по умолчанию для всех объявлений. Гарантирует, что ссылка на значение не может быть переприсвоена. Это делает код более предсказуемым и защищает от случайных изменений.

    const API_URL = 'https://api.example.com';
    const user = { name: 'John' };
    user.name = 'Jane'; // Допустимо: изменяется содержимое объекта, а не ссылка.
    // user = {}; // TypeError: Assignment to constant variable.
    
  • let: Используй только когда переменной потребуется переприсваивание в рамках блока. Например, счётчики в циклах, флаги состояний.

    let counter = 0;
    for (let i = 0; i < 10; i++) {
        counter += i;
    }
    let isLoading = true;
    isLoading = false;
    

Итог: современный подход

  1. const — твой основной инструмент. Используй везде, где значение не планируется переприсваивать.
  2. let — для управляемого переприсваивания. Используй осознанно, только когда это необходимо.
  3. var — только для поддержки legacy-кода. В новом коде не используй никогда. Его знание нужно исключительно для понимания старых кодовых баз и особенностей hoisting.

Этот подход соответствует принципам написания чистого, безопасного и поддерживаемого кода, минимизируя целый класс типичных ошибок, связанных с областью видимости и временем жизни переменных. Все современные линтеры (ESLint с правилом no-var) и стилевые гайды прямо запрещают использование var.

Пользовался ли var в JavaScript | PrepBro