티스토리 뷰
클로저 문제에 대한 var와 let의 차이점(왜 5 5 5 5)
같은 부분
setTimeout()
함수가 task Queue
에 들어간 다음 call stack
에 있는 for
문이 끝나면 call stack
에 들어와서 실행을 하는데 이때 클로저를 이용하여 i를 참조합니다.
1. var인 경우
var는 함수형 스코프로 setTimeout()
함수가 call stack
에 들어와서 실행 할 때 상위 스코프에게 i
값을 물어보면 i
값은 이미 5값이 되어 있어서 5 5 5 5 5
와 같이 출력이 됩니다.
const nums = [0, 1, 2, 3, 4];
for (var i = 0; i < nums.length; i++) {
setTimeout(function () {
console.log(`${i}`);
}, i * 1000);
}
// 5 5 5 5 5
2. let인 경우
let는 블록형 스코프로 for
문 내에 새로운 scope
를 가지기 때문에 반복을 실행 할 때마다 새로운 let이 선언이 됩니다.
setTimeout()
함수가 call stack
에 들어와서 실행 될 때 상위 스코프를 검색할 때 매 반복마다 선언 및 초기화된 i
값을 참조하여 0 1 2 3 4
값을 가지게 되는 것입니다.
const nums = [0, 1, 2, 3, 4];
for (let i = 0; i < nums.length; i++) {
setTimeout(function () {
console.log(`${i}`);
}, i * 1000);
}
// 0 1 2 3 4
마무리
js에 있는 scope와 클로저와 동작 원리 모두 매우 밀접한 관계에 있는 것을 알게 되어 다시 한번 공부를 하는 시간을 가져 좋았습니다.
REF
https://github.com/getify/You-Dont-Know-JS/blob/2nd-ed/scope-closures/ch1.md
https://github.com/baeharam/Must-Know-About-Frontend/blob/main/Notes/javascript/closure.md
https://meetup.toast.com/posts/86
반응형
'Tip and Error > Javascript' 카테고리의 다른 글
SAP위한 Express 설정 (window, VSCode Live Server X) (0) | 2022.04.11 |
---|---|
SPA를 위한 history API (0) | 2022.04.07 |
Promise Error handling (0) | 2022.03.31 |
JS에서 Variable Memory Address를 얻을 수 있나?? (0) | 2022.03.23 |
var를 권장하지 않는 이유(Hoisting) (0) | 2022.03.20 |
공지사항
최근에 올라온 글