Главные различия
| var | let |
|---|
| Область видимости | функция (или script/global) | блок { } |
| Hoisting | да, инициализация undefined | да, но в TDZ до объявления |
| Повторное объявление | в той же scope — можно | нельзя |
| Глобальный объект | на верхнем уровне становится свойством window (в браузере) | не становится |
| В циклах + замыкание | одна общая привязка | своя на итерацию |
Классический баг с var в цикле
for (var i = 0; i < 3; i++) {
setTimeout(() => console.log(i), 0);
}
for (let j = 0; j < 3; j++) {
setTimeout(() => console.log(j), 0);
}
Что ответить кратко
let — блочный scope, TDZ, без повторного объявления; var — function scope, hoisting в undefined, устаревший стиль для локальных переменных.