어느 분께서 하이라이팅 알려주셔서

깔끔하게 해서 다시 올리는 거임




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가 블럭이나 함수마다 생성되는 개수로 이해하면 개별적으로 들어갈지 안 들어갈지 명확해지는 것 같다