반복문은 반복될 때마다 for 안에 있는 코드가 실행됩니다 그래서
1회반복시 setTimeout(function() { console.log(i); }, 0*1000 ) 실행
2회반복시 setTimeout(function() { console.log(i); }, 1*1000 ) 실행
...
인데
setTimeout안에 있는 console.log(i)는 반복문 다 끝나고 실행됩니다
setTimeout은 몇초 후에 내부 코드를 실행해달라고 하는 특수한 함수니까요
암튼 반복문 끝나고 console.log(i) 실행할 때 컴퓨터는 i같은 변수같은게 보이면 i값을 근처에서 찾아서 끼워넣으려고 합니다
거기서 이제 let과 var 변수의 차이가 발생합니다