Переменные: 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защищает от утечек и конфликтов. - Осознанный выбор объявления сразу снижает количество логических багов.