При запуске таймаута получается блок цикла сохраняется в память и пока он не отработает, она не очистится и из-за этого i всегда будет разным?
А с примером var i , получается i не сохраняется в блоке и по этому через время он будет искать i за областью видимости нашего цикла?
for(let i = 0; i < 10; ++i) {
setTimeout(() => {
console.log(i);
}, 100)
}