Используете ли var в работе
Что проверяют
Понимаете ли вы, чем var отличается от let и const, а не просто повторяете «var устарел». Следом обычно дают задачку на замыкание в цикле или на обращение к переменной до объявления.
Как отвечать
Короткий ответ: в новом коде нет. По умолчанию const, let там, где переменную переприсваивают, а var запрещён правилом ESLint no-var (в паре с prefer-const). Дальше объясните почему:
- область видимости:
varвидна во всей функции,letиconstтолько в блоке{}. Переменная изifилиforне утекает наружу; - поднятие: объявления всех трёх поднимаются, но
varсразу получаетundefined, аletиconstдо строки объявления находятся во временной мёртвой зоне, и обращение даётReferenceError. Ошибка лучше, чем тихийundefined; - повторное объявление:
var xдважды в одной области проходит молча,letдаст синтаксическую ошибку; - глобальный объект:
varна верхнем уровне обычного скрипта создаёт свойствоwindow. В ES-модулях этого нет; - циклы:
for (var i = 0; i < 3; i++) setTimeout(() => console.log(i))выведет три тройки, потому чтоiодна на весь цикл. Сletкаждая итерация получает свою привязку, и вывод будет 0, 1, 2.
Про const добавьте оговорку: он запрещает переприсваивание, а не изменение объекта. const arr = []; arr.push(1) работает, для неизменяемости нужен Object.freeze или неизменяемые структуры.
var вы встретите в легаси и в выводе старых сборок. Писать его руками ради старых браузеров не нужно: поддержку старых сред обеспечивает транспиляция через Babel или TypeScript с нужным target.
Где спотыкаются
Говорят, что let и const не поднимаются. Поднимаются, иначе не было бы мёртвой зоны, отличие именно в инициализации.
Утверждают, что const делает значение неизменяемым, и путаются на примере с мутацией массива.
Предлагают массово заменить var на let в старом файле автозаменой. Код, который обращается к переменной до объявления, объявляет её повторно или читает через window, после этого начнёт падать, поэтому такую замену делают с тестами и по одному модулю.