변수, 호이스팅, TDZ(Temporal Dead Zone), 스코프
var name = 'kim';
var name = 'park';
var 는 한번 선언한 변수를 다시 선언할 수 있다. 하지만 let은 안된다.
-스코프는 범위이다.
hoisting : 스코프 내부 어디서든 변수 선언은 최상위에 선언된 것 처럼 행동
var type으로 선언한 경우 호이스팅된 후 사용이 가능한데 값은 undefined 이다.
선언은 호이스팅되지만 할당은 호이스팅 안되서 그러는 것이다.
let 과 const도 호이스팅 되는데 실제로 사용할 경우에는 에러가 발생하는데 그 이유는 이는 TDZ 때문이다.
TDZ는 대충 직역하면 일시적으로 죽은 공간인데 이는 초기화가 안된 변수가 있어서 죽은 공간이라고 생각하면 된다.
(호이스팅은 스코프 단위로 일어난다.)
let age = 30;
function showAge(){
console.log(age);
let age = 20;
}
showAge();
위 코드가 그 예시인데 에러가 발생하는 코드이다.
그 이유는 let도 호이스팅이 되서 에러가 발생하는 것이다.
showAge 함수 안에 let age 가 없었다면 에러가 발생하지 않는데 이게 있어서
console.log(age)에서 하단에 선언된 age를 호이스팅되어 사용하게되는데 여기서 문제는
var와 다르게 let은 선언과 초기화가 동시에 이루어지지 않는다.
그래서 선언만 되고 초기화가 안되서 레퍼런스 에러가 발생하는 것이다.
var 1.선언, 초기화 2. 할당
let 1.선언 2.초기화 3.할당
const 1.선언,초기화,할당 (무조건 선언 시 할당해야 된다.)
var : 함수 스코프
let, const : 블록 스코프(함수, if, for, while, try/catch문)
함수는 무조건 못 벗어나는 스코프다.