공부하다가 정말 좋은 예제가 보여서, 갖고 왔다!
물론 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()