1. 오답: setTimeout 실행 할 때 for문 다 돌고나서의 i값


2. 정답: 실행하기 전에 일일이 전달되어 넣어주는 i값


function cs(h)

{

for (var i=0;i<h;i++)

{

setTimeout(function(){

console.log(i);

}, i*1000);

}

}

cs(3);

결과:333

var는 함수스코프라

countSeconds 함수에서 i가 1번 생성되어서

setTimeout에 예약된 function ()이 실행되는 순간에는 이미 최종 i가 찍히게 된다


function cs(h)

{

for (let i=0;i<h;i++)

{

setTimeout(function(){

console.log(i);

}, i*1000);

}

}

cs(3);

결과:012

let은 블럭스코프라

for문 안의 단계마다 i가 블럭 단위마다 따로따로 3번 생성되는 것이다 (딱국님이 알려줌)

따라서 우리가 원하는 결과가 나온다


즉 함수스코프는 for 문에서 i가 1개이지만

블럭스코프는 for 문에서 블럭마다 i가 3개나 되는 놈들이 생기는 것이다


어느 게 절대적이다가 아니라 두가지 다 의미가 있는 것이다


function cs(h)

{

let i;

for (i=0;i<h;i++)

{

setTimeout(function(){

console.log(i);

}, i*1000);

}

}

cs(3);

결과:333

let 이 설정된 놈은 for문 밖에 있으니 그 전체 블럭만 관여하는 것이다 즉 생성되는 i의 개수가 1개라는 것이다


i가 블럭이나 함수마다 생성되는 개수로 이해하면 개별적으로 들어갈지 안 들어갈지 명확해지는 것 같다