for (var i = 1; i < 6; i++) {
setTimeout(() => {
console.log(i);
}, 1000)
}
// 아래 코드는 이해를 돕기 위함 (실제로 코드가 아래처럼 되는 것은 아님)
var i = 1;
for (; i < 6; i++) {
setTimeout(() => {
console.log(i);
}, 1000)
}
setTimeout
함수는 for
문이 끝나면 실행된다. (비동기)
그래서 i
는 이미 6이된 상태임으로 6이 5번 출력된다.
for (let i = 1; i < 6; i++) {
setTimeout(() => {
console.log(i);
}, 1000)
}
// 아래 코드는 이해를 돕기 위함 (실제로 코드가 아래처럼 되는 것은 아님)
let i = 1;
for (; i < 6; i++) {
let i = i;
setTimeout(() => {
console.log(i);
}, 1000)
}
setTimeout
함수는 for
문이 끝나면 실행된다. (비동기)
이 상황은 var
를 사용했을 때와 같다.
하지만, let
을 사용했기에 유효범위가 블록 스코프
다.
즉, 반복문이 작동할 때마다 새로운 스코프가 만들어져서 i
값이 저장된다.(i=1
, i=2
, i=3
...)
그래서 1~5
가 순서대로 출력된다.