면접 대비용으로 비동기 루프 처리 구현 중인데 예상한 값으로 출력이 안 됩니다.
코드:
function createAlerts() {
const functions = [];
for (var i = 0; i < 3; i++) {
functions.push(function() {
console.log(i);
});
}
return functions;
}
const alerts = createAlerts();
alerts[0]();
alerts[1]();
alerts[2]();
오류: 0, 1, 2가 나와야 하는데 모두 3으로 출력됨.
시도: 콘솔 로그 위치 변경, 함수 호출 시점 조정.
질문: var 변수가 루프 내에서 어떻게 공유되길래 모든 콜백이 마지막 값만 참조하는 건가요?
댓글9
-
빗방울
2026.10.30 18:31
-
빗방울
2026.10.30 19:26
ㄹㅇ let으로 바꾸면 블록 스코프라 바로 해결될 듯요 ㅋㅋ
면접관들이 이거 진짜 좋아하는 질문이라 빡세긴 하네요 ㄷㄷ
-
빗방울
2026.10.30 18:43
IIFE로 감싸서 값 고정시키는 방법도 있는데 그거 한번 찾아보세요.
옛날 방식이라 요즘은 잘 안 쓰지만 원리 이해하기엔 좋을듯요 ㅋㅋ
화이팅하시길 ㄷㄷ
-
빗방울
2026.10.30 19:59
맞아요 IIFE가 진짜 정석이긴 하죠 ㅋㅋ
원리 파악하려면 그거만한 게 없는 듯요 ㄷㄷ
-
빗방울
2026.10.30 20:43
ㄹㅇ IIFE가 좀 복잡하긴 해도 개념 잡기엔 최고인듯요 ㅋㅋ
요즘은 let 쓰면 되니까 굳이 안 쓰게 되는데 원리는 알아둬야 하죠 ㄷㄷ
-
빗방울
2026.10.30 21:29
ㄹㅇ IIFE로 묶으면 매 루프마다 새로운 스코프 생겨서 값 고정되더라고요 ㅋㅋ
원리 파악용으로는 이게 진짜 최고인듯요 ㄷㄷ
-
빗방울
2026.10.30 20:11
이거 실행 컨텍스트랑 렉시컬 환경 개념까지 엮어서 답변 준비하시면 면접 때 점수 더 따실 듯요 ㅋㅋ 화이팅하세요 ㄷㄷ
-
빗방울
2026.10.30 21:36
MDN 문서에서 클로저 파트 한번 쭉 읽어보시는 거 추천함 ㅋㅋ
이거 제대로 이해하면 나중에 다른 비동기 이슈 터졌을 때도
대처하기 편하실 듯요 ㄷㄷ
-
빗방울
2026.10.30 23:09
크롬 개발자 도구 디버거로 루프 돌 때 변수 값 변하는 거 직접 찍어보세요 ㅋㅋ
그거 눈으로 한 번 보면 이해 훨씬 빠를듯요 ㄷㄷ
모든 이야기1455
가벼운 안부부터 깊은 생각까지, 함께 나눠요.
이거 var 쓰면 함수 스코프라 다 공유해서 그런듯.
그냥 var를 let으로 바꾸면 바로 해결될 것 같네요.
면접 단골 문제라 빡세네요 ㅋㅋ