선언이 평가되기 전 접근할 때의 차이를 이해합니다.
함수 선언은 본문과 함께 초기화되어 앞에서 호출할 수 있습니다. var는 선언만 undefined로 초기화되지만 let과 const는 선언 줄 전까지 TDZ에 있어 접근하면 오류가 납니다.
try 블록 안에서 greet()가 function greet 선언보다 먼저 호출되지만, 함수 선언은 블록에 들어서는 순간 본문까지 준비되므로 첫 메시지가 정상적으로 만들어집니다. 다음 줄의 oldValue는 아래쪽 var 선언이 함수 맨 위로 끌어올려진 상태라 오류 없이 undefined로 읽히고, 10은 대입 줄에 도달해야 들어갑니다. 두 메시지는 join으로 줄바꿈되어 두 줄로 출력됩니다.
함수를 변수에 담는 함수 표현식은 함수 선언처럼 끌어올려지지 않습니다. var greet에 함수를 대입하는 방식이었다면 선언 전 호출에서 undefined를 호출하게 되어 TypeError가 나고, const로 담았다면 TDZ 때문에 ReferenceError가 납니다.
호이스팅에 의존해 선언 전 변수를 사용하는 코드는 실행 순서를 이해하기 어렵습니다.
직접 바꿔보세요let 변수를 선언 전에 읽어 어떤 오류가 나는지 try/catch 안에서 확인하세요.