Переменные: let, const, var

Переменные: let, const, var

Технический фундамент жизненного цикла переменных

Выбор объявления влияет на безопасность состояния:

  • const фиксирует ссылку и защищает неизменные правила;
  • let задает управляемо изменяемое состояние;
  • var имеет исторические особенности hoisting/scope, которые усложняют поддержку;
  • корректный выбор объявления уменьшает число случайных мутаций и конфликтов имен.

Практическое правило: сначала определяй намерение переменной, потом выбирай ключевое слово.

Почему выбор объявления переменной влияет на баги

На старте кажется, что let, const и var просто разные способы "создать переменную". На практике выбор влияет на предсказуемость кода, область видимости и риск случайного перезаписывания данных.

Ключевой момент: в современном коде по умолчанию выбирают const, а let используют, когда значение действительно меняется.

Проверь себя: почему случайное переопределение переменной чаще происходит с let/var, чем с const?

const: значение нельзя переназначить

const courseName = 'JavaScript Academy';
// courseName = 'TS School'; // TypeError

const защищает от случайного переназначения.

Смотри, что важно: для объектов и массивов const запрещает замену ссылки, но не запрещает изменение содержимого.

const user = { name: 'Anna' };
user.name = 'Ira'; // ок
// user = { name: 'Max' }; // нельзя

Здесь часто путаются: const запрещает переназначение (новое значение через =), но не запрещает мутацию (изменение полей/элементов внутри объекта).

const tags = ['js'];
tags.push('basics'); // ок (мутация массива)
// tags = ['js', 'basics']; // нельзя (переназначение ссылки)

let: когда значение должно меняться

let attempts = 0;
attempts += 1;

let подходит для счетчиков, состояний шага, переменных внутри цикла.

Анти-провал: если ты не планируешь менять значение - используй const.

var: почему его лучше избегать

var старый способ объявления из до-ES6 эпохи.

Проблемы var:

  • функциональная область видимости вместо блочной;
  • hoisting с undefined до инициализации;
  • повторные объявления в одном scope без явной ошибки;
  • риск неочевидных конфликтов в больших файлах.
var count = 1;
var count = 2; // ок, но легко не заметить и сломать логику
if (true) {
  var mode = 'debug';
}

console.log(mode); // 'debug' (утек из блока)

Здесь часто путаются: с let/const эта переменная была бы недоступна вне блока.

Блочная область let и const

if (true) {
  let localValue = 10;
  const localFlag = true;
}

// console.log(localValue); // ReferenceError

Это полезная защита: данные живут только там, где нужны.

Проверь себя: почему блочная область особенно важна в условиях и циклах?

Мини-сценарий: статус урока

Допустим, нужно вычислить результат прохождения:

const passThreshold = 70;
const score = 65;
let status = 'retry';

if (score >= passThreshold) {
  status = 'passed';
}

Здесь:

  • passThreshold - const, потому что не меняется;
  • score - const, если это вход и ты не планируешь его переназначать;
  • status - let, потому что он меняется по логике.

Правильный выбор объявления делает намерение кода прозрачным.

Частые ошибки новичков

  • Использовать let "на автомате" везде.
  • Пытаться переназначить const и получать runtime-ошибку.
  • Использовать var в новом коде без необходимости.
  • Путать "неизменяемую ссылку" и "неизменяемый объект".

Анти-провал: перед объявлением спроси себя: "Это значение будет переназначаться?".

Что будет, если изменить входные данные

Если score изменится с 65 на 75, статус должен обновиться на passed. Если passThreshold вдруг объявлен через let и случайно изменится в другом месте, логика сломается. Поэтому неизменные правила лучше хранить в const.

Проверь себя: какие две переменные в этом сценарии должны быть const всегда?

Краткий итог

  • const - базовый выбор для значений, которые не переназначаются.
  • let - для переменных, которые меняются по логике.
  • var в современном коде лучше избегать из-за особенностей области видимости и hoisting.
  • Блочная область let/const защищает от утечек и конфликтов.
  • Осознанный выбор объявления сразу снижает количество логических багов.