var와 달리 let은 블록 스코프(블록을 신경 씀)라서 그렇습니다. 블록은 if 문, for 문, while 문, 함수에서 볼 수 있는 중괄호({})를 의미합니다. 블록 바깥에서는 블록 안에 있는 let에 접근할 수 없습니다. let뿐만 아니라 const도 블록 스코프를 가집니다. 블록 스코프를 다르게 말하면 블록이 끝날 때 내부의 변수도 같이 사라진다고 할 수 있습니다.
for 문에 var를 사용해 보겠습니다. var는 블록과 관계가 없으므로 문제없이 돌아갑니다. for 문이 끝났을 때 i가 5가 되어 있다는 점에 주목하세요.
for (var i = 0; i < 5; i++) {}
i;
< 5
for 문에 let을 사용하면 에러가 발생합니다. for 문 블록 바깥에서 변수 i에 접근했기 때문입니다. 코드에서 let이 블록 바깥에 있지만, for 문에서는 블록 안에 있는 것으로 칩니다.
for (let i = 0; i < 5; i++) {}
i;
Uncaught ReferenceError: i is not defined