요즘은 var 쓰지 말고 let const 쓰라고 해서 그렇게 하고는 있는데, 정확히 뭐가 다른지를 몰라서 여쭤봐요. 특히 호이스팅이랑 TDZ라는 단어가 자꾸 나오는데 이게 뭔지 모르겠어요.
일단 var로 이런 걸 해봤는데
console.log(a); // undefined (에러 안 남?)
var a = 1;
console.log(b); // ReferenceError
let b = 2;
var로 선언한 a는 선언 위에서 찍어도 에러가 안 나고 undefined가 나와요. 근데 let으로 한 b는 같은 위치에서 찍으면 ReferenceError가 터져요. 둘 다 아직 값 대입 전인데 왜 하나는 undefined고 하나는 에러인가요. 이게 TDZ라는 거랑 관련 있는 건가요?
그리고 반복문에서도 이상한 걸 봤어요.
for (var i = 0; i < 3; i++) {
setTimeout(() => console.log(i), 0);
}
// 3 3 3 이 찍힘
이걸 let으로 바꾸면 0 1 2 가 나온다는데 왜 이렇게 차이가 나는지도 모르겠어요. var는 함수 스코프고 let은 블록 스코프라는 말은 봤는데 저 반복문 결과랑 어떻게 연결되는 건가요.
마지막으로 const는 재할당이 안 된다는 건 알겠는데, const로 만든 배열에 push는 되더라고요. 이건 상수인데 왜 값이 바뀌는 건지도 같이 설명해주시면 감사하겠습니다.