: 스코프 내부 어디서든 변수 선언은 최상위에 선언된 것 처럼 행동
1) 다음과 깉이 var는 변수를 선언하기 전에 변수를 사용해도 에러가 나지 않는다. 그 이유는 무엇일까?
console.log(name); //undegined
var name = 'Mike';
그 이유는 var의 선언은 코드가 실제로는 이동하지 않았지만 다음과 같이 최상위로 이동한 것 처럼 동작하기 때문이다. 이를 호이스팅이라 하며 선언은 호이스팅 되지만 할당은 호이스팅 되지 않기 때문에 다음과 같이 undefined로 찍히는 것을 볼 수 있다.
var name;
console.log(name); //undefined
name = 'Mike';
하지만 같은 상황에서 let은 에러가 난다. 그 이유는 Temporal Dead Zone
(TDZ)때문이다. let과 const또한 호이스팅 되지만 아래와 같이 TDZ의 영향을 받기 때문에 할당을 하기 전에는 사용할 수 없습니다. 이를통해 코드를 예측 가능하고 잠재적인 버그를 줄일 수 있습니다..
호이스팅은 스코프 단위로 일어납니다. 따라서 아래와 같이 스코프는 함수 내부이기 때문에 다음과 같이 코드를 작성할 경우 2번째 let이 호이스팅되어 에러가 발생하게 됩니다.
var : 함수 스코프(function-scoped)
let, const : 블록 스코프(block-scoped)
-모든 코드블록 내에서 선언된 변수는 코드 블록 내에서만 유요합니다.(코드블록 내에서 선언된 변수는 지역변수입니다.)