패스잇
프론트엔드 개발 · 심화

for 루프 안에서 setTimeout 콜백이 모두 같은 값을 출력하는 고전적인 문제를 var로 작성했을 때 왜 발생하는지, 그리고 let으로 바꾸면 왜 의도대로 동작하는지를 블록 스코프와 클로저 캡처 관점에서 설명해주세요.

힌트 · 변수 환경(environment record)이 반복마다 새로 생성되는지 하나만 공유되는지의 차이로 접근하세요.

varlet클로저블록 스코프호이스팅

모범답안

var를 사용하면 for 루프가 끝난 후에 setTimeout 콜백들이 실행되는데, 이때 var 변수는 함수 스코프를 가지므로 루프 전체에서 하나의 변수 환경을 공유합니다. 따라서 콜백이 실행될 시점에는 이미 루프가 완료되어 변수 값이 마지막 값으로 고정되어 있기 때문에 모두 같은 값을 출력하게 됩니다.

let을 사용하면 for 루프의 각 반복마다 새로운 블록 스코프와 함께 새로운 변수 환경이 생성됩니다. setTimeout 콜백은 자신이 생성된 스코프의 변수를 클로저로 캡처하는데, 각 콜백은 자신만의 고유한 변수 값을 가지게 되므로 의도대로 각기 다른 값을 출력하게 됩니다.

읽었다면, 이제 직접 답해볼 차례예요

패스잇 앱에서 이 질문에 말로 답하면 AI가 꼬리질문까지 이어가며 1:1 코칭합니다.

함께 보는 JavaScript 면접 질문

← JavaScript 면접 질문 전체 보기