공부하다가 정말 좋은 예제가 보여서, 갖고 왔다!
물론 var의 경우 hoisting으로 인한 문제도 발생한다.
이를 해결한 것이 let과 const다.
실행 컨텍스트에서 렉시컬 환경을 별도로 구성 후, initialize를 TDZ을 사용함으로써 막기 때문에, 결과적으로 초기화를 막아버렸기 때문에 안전하다!
그렇지만 무엇보다 var의 가장 주된 문제는
var은 함수 레벨 스코프에서 동작한다는 걸 계속 잊지 말자!
(어떻게 보면 둘 다 연관되어 있는 것 같긴 하지만 말이다)
var score1 = 0;
let score2 = 200;
const defaultScore = 0;
function outer() {
// score은 함수 레벨 스코프이므로 다 접근 가능
if (true) {
var score = 0;
}
// i는 이미 함수 스코프 단위에서 존재하고 있음. 따라서 setTimeout가 실시된 0.1ms 이후에는 이미 처리가 완료되어 3이 3번 출력됨.
for (var i = 0; i < 3; i++) {
setTimeout(function() {
console.log(i);
}, 100);
}
console.log(score);
}
outer()