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
역시 함수 내부에서 선언되면 그 범위를 벗어날 수 없다