프론트엔드 개발 · 심화
for 루프 안에서 setTimeout 콜백이 모두 같은 값을 출력하는 고전적인 문제를 var로 작성했을 때 왜 발생하는지, 그리고 let으로 바꾸면 왜 의도대로 동작하는지를 블록 스코프와 클로저 캡처 관점에서 설명해주세요.
힌트 · 변수 환경(environment record)이 반복마다 새로 생성되는지 하나만 공유되는지의 차이로 접근하세요.
varlet클로저블록 스코프호이스팅
모범답안
var를 사용하면 for 루프가 끝난 후에 setTimeout 콜백들이 실행되는데, 이때 var 변수는 함수 스코프를 가지므로 루프 전체에서 하나의 변수 환경을 공유합니다. 따라서 콜백이 실행될 시점에는 이미 루프가 완료되어 변수 값이 마지막 값으로 고정되어 있기 때문에 모두 같은 값을 출력하게 됩니다.
let을 사용하면 for 루프의 각 반복마다 새로운 블록 스코프와 함께 새로운 변수 환경이 생성됩니다. setTimeout 콜백은 자신이 생성된 스코프의 변수를 클로저로 캡처하는데, 각 콜백은 자신만의 고유한 변수 값을 가지게 되므로 의도대로 각기 다른 값을 출력하게 됩니다.
읽었다면, 이제 직접 답해볼 차례예요
패스잇 앱에서 이 질문에 말로 답하면 AI가 꼬리질문까지 이어가며 1:1 코칭합니다.
함께 보는 JavaScript 면접 질문
- JavaScript의 WeakMap과 WeakSet의 특징과 사용 사례를 설명해주세요.
- JavaScript의 이터레이터(Iterator)와 제너레이터(Generator)에 대해 설명해주세요.
- JavaScript의 Proxy와 Reflect의 용도와 사용법에 대해 설명해주세요.
- 메모이제이션 캐시나 카운터를 클로저로 구현할 때, 시간이 지나면서 의도치 않게 메모리가 계속 점유되는 상황이 생길 수 있습니다. 클로저가 참조를 붙잡는 방식이 GC와 어떻게 상호작용하는지, 그리고 이를 어떻게 완화할 수 있을지 설명해주세요.
- 화살표 함수의 this와 일반 함수의 this는 결정 시점과 규칙이 다릅니다. 객체 메서드를 화살표 함수로 정의했을 때 흔히 발생하는 버그와, 반대로 콜백에서 화살표 함수가 유리한 경우를 각각 예를 들어 설명해주세요.