var, let и const
Область видимости
function example() {
if (true) {
var x = 1 // функциональная область видимости
let y = 2 // блочная область видимости
const z = 3 // блочная область видимости
}
console.log(x) // 1 - доступна
console.log(y) // ReferenceError
console.log(z) // ReferenceError
}
| var | let | const | |
|---|---|---|---|
| Область | Функция / глобальная | Блок | Блок |
| Hoisting | Да (значение undefined) | Да (TDZ) | Да (TDZ) |
| Переприсваивание | Да | Да | Нет |
| Повторное объявление | Да | Нет | Нет |
Temporal Dead Zone (TDZ)
let и const поднимаются (hoisting), но недоступны до строки объявления - это называется Temporal Dead Zone.
console.log(a) // undefined (var hoisted)
console.log(b) // ReferenceError: Cannot access 'b' before initialization
var a = 1
let b = 2
const и объекты
const запрещает переприсваивание, но не делает объект неизменяемым:
const user = { name: "Иван" }
user.name = "Пётр" // ✅ можно менять свойства
user = {} // ❌ TypeError: Assignment to constant variable
// Для глубокой заморозки:
const frozen = Object.freeze({ name: "Иван" })
frozen.name = "Пётр" // silently fails (или TypeError в strict mode)
Что использовать
- const - по умолчанию для всего.
- let - когда переменная должна меняться (счётчик, цикл).
- var - избегать в современном коде. Иногда встречается в легаси.