2.2 진짜 블록 스코프
var는 블록에서 튀어나온다. var로 블록 내에서 변수를 선언하면 해당 블록 내부뿐만 아니라 외부에서도 변수를 사용할 수 있다.
function jumpOut() {
var a = [1, 2, 3];
for (var i = 0; i < a.length; ++i) {
var value = a[i];
console.log(value);
}
console.log("Outside loop " + value); // 왜 'value'를 여기서도 사용할 수 있을까?
}
jumpOut();
jumpOut의 작성자는 아마도 루프 외부에서 값에 접근할 수 있도록 의도하지는 않았겠지만 접근할 수 있다(나도 마찬가지다). 왜 이것이 문제일까? 몇 가지 이유가 있다. 첫째, 변수는 유지 관리를 위해 가능한 한 좁게 범위를 지정해야 한다. 필요한 만큼만 존재해야 하며 그 이후 더 이상 없어야 한다. 둘째, 코드의 명백한 의도와 실제 효과가 다를 때마다 버그와 유지 관리 문제를 일으킨다. let과 const는 진정한 블록 스코프를 가짐으로써 이것을 해결한다.