var로 선언한 변수들은 값의 재할당 및 재선언이 가능하다.
hoisting이 된다.
선언부가 가장 위로 끌어올려진다. 선언만 끌어올려지기 때문에 출력하면 값은 undefined가 되나, const, let과 같이 참조 오류는 발생하지 않는다.
✅ const, let은 속한 스코프의 최상단으로 호이스팅은 되지만, 선언되고 초기화되기 전까지는 temporal dead zone(TDZ - 안전장치) 영역에 속하게 됨.
✅ 블록 스코프(속한 블록 내부로 제한됨.)를 가진다.
변수의 유효 범위
변수 선언문 (var, let, const), 함수 선언문 등이 해당 스코프의 선두로 옮겨진 것처럼 동작하는 특성.
스코프의 시작 지점부터 초기화 시작 지점까지는 변수를 참조할 수 없는데, 이 구간을 일시적 사각지대(TDZ)라고 부른다.

💡 const는 선언과 동시에 반드시 값을 할당해줘야 하고, 재할당이 불가능하여 상수에 주로 사용한다.
let은 선언과 값 할당을 분리해서 할 수 있고, 값의 재할당도 가능하다. 그러나 재 선언은 불가능하다.
var로 선언한 변수들은 값의 재할당이 가능하며, 재선언도 가능하다.
var는 함수 스코프를 가진다. 선언부가 함수 안이기만 하면, 블록에 선언되었더러도 함수 내부 어디든 돌아다닐 수 있음. 반면, const, let은 블록 스코프(속한 블록 내부로 제한됨.)를 가진다. const, let은 속한 스코프의 최상단으로 호이스팅은 되지만, 선언되고 초기화되기 전까지는 temporal dead zone 영역에 속하게 된다.
https://www.youtube.com/watch?v=HsJ4oy_jBx0
https://www.yalco.kr/27_scope/
https://poiemaweb.com/es6-block-scope