Почему с let работает а с var нет?
У var область видимости функции, на каждой итерации цикла мы имеем дело с одной и той же переменной.
У let - область видимости блока, на каждой итерации цикла новая переменная
Переменная var – одна на все итерации цикла и видна даже после цикла

С переменной let – всё по-другому.
Каждому повторению цикла соответствует своя независимая переменная let. Если внутри цикла есть вложенные объявления функций, то в замыкании каждой будет та переменная, которая была при соответствующей итерации.