let과 var는 크게 다르지 않음

에러가 나오지 않음

에러를 반환함

var aaa = "hi"를 선언하기 전에 콘솔에 찍어도 에러가 나오지 않음.

애초에 정의되지 않았다고 오류가 발생함

다음과 같이 var는 실제로 코드가 이동하지는 않으나 최상위로 끌어올라감.
이를 호이스팅이라고 한다.

왜 그러면 console.log에는 undefined가 뜰까??
이유는 선언은 호이스팅 되지만 할당은 호이스팅이 되지 않기 때문임.

그렇다면 let과 const는 호이스팅이 되지 않느냐??

그렇지 않음.
let과 const도 호이스팅이 되며 호이스팅이란 스코프 내부 어디서든 변수 선언은 최상위에 선언된 것 처럼 행동한다.
let과 const는 var와 같이 에러를 반환하지 않는 이유는 무엇일까?

TDZ란 선언 전에 변수를 사용하는 것을 허용하지 않는 것
https://ui.toast.com/weekly-pick/ko_20191014
let과 const는 할당을 하기 전에는 사용할 수 없음.
let과 const는 TDZ의 영역에 존재하는 변수임
선언만 호이스팅이 되고 할당은 호이스팅이 되지 않기 때문에 사용할 수 없게 되는 것임.
이렇게 사용하면 예측 가능하게 하고 잠재적인 에러를 줄일 수 있음



let이 호이스팅 되지 않는 구나가 아니라 호이스팅은 스코프 단위로 일어나기 때문에 let age = 20 범위는 함수 showAge부분이다.
let age = 20은 showAge함수 부분에서 호이스팅되고 변수 할당 전에 사용이 되었으므로 에러를 발생한다.
가. 선언단계
나. 초기화단계
다. 할당단계
거치는데
var의 경우는
가. 선언 및 초기화 단계
나. 할당 단계
이렇게 되기 때문에 var를 사용해도 에러가 발생하지 않음
(초기화 단계는 undefined를 할당해주는 단계)
반면 let의 경우는
가. 선언단계
나. 초기화단계
다. 할당단계
초기화 단계는 실제 코드에 도달하였을 경우 실행되기 때문에 호이스팅시 레퍼런스 오류가 발생하게 된다.
const는
선언단계 + 초기화 + 할당 같이 된다.
그래서 할당을 하지 않으면

이렇게 에러가 발생한다.

var는 함수스코프
let, const는 블록스코프
즉 지역변수를 의미함

가능
블록스코프인 let과 const를 사용할 경우 에러가 발생함
var 역시 함수 내부에서 선언되면 그 범위를 벗어날 수 없다
