Область видимости у var и let внутри цикла. Как правильно?
Когда происходит клик, то i берется из внешнего LexicalEnvironment.
К моменту клика цикл завершился, последнее значение было i=2.
В результате значение всегда равно 2.
С переменной let не так.Каждому повторению цикла соответствует своя независимая переменная let. Если внутри цикла есть вложенные объявления функций, то в замыкании каждой будет та переменная, которая была при соответствующей итерации.Подробнее
По всей видимости, потому что если мы используем let, то на каждую итерацию цикла создается отдельный скоуп. По идее, должно работать с var если все это дело обернуть в анонимную функцию, и запустить ее с передачей текущего i в качестве аргумента.