var |
let |
const |
|
|---|---|---|---|
| Область видимості | функція | блок {} |
блок {} |
| Повторне присвоєння | так | так | ні |
| Повторне оголошення | так | ні | ні |
| Доступ до оголошення | undefined |
помилка (TDZ) | помилка (TDZ) |
if (true) {
var a = 1;
let b = 2;
}
a; // 1 - var «протікає» з блоку
b; // ReferenceError
Підняття (hoisting): оголошення всіх трьох обробляються до виконання коду, але по-різному. var одразу отримує undefined, тож звернення до нього до рядка оголошення не дає помилки - лише тихий undefined. let і const до оголошення перебувають у «тимчасовій мертвій зоні» (TDZ): звернення кидає ReferenceError. Друге поведінка краща: помилка видна одразу.
const не робить значення незмінним - лише забороняє переприсвоїти змінну:
const user = { name: 'Оля' };
user.name = 'Іра'; // можна: змінюємо вміст об'єкта
user = {}; // TypeError
Для незмінності вмісту - Object.freeze() (поверхнево).
Сучасне правило: const за замовчуванням, let - коли значення справді змінюється, var - не використовувати.