같은 이름 변수
, 재할당
, immutable
, scope
, function-level
, block-level
, 호이스팅
, 선언
, 초기화
, undefined
먼저 let과 const는 JS ES6에서 var의 단점을 보완하기 위해 추가된 변수 선언 방식입니다.
var 같은 경우, 같은 이름의 변수
를 여러번 선언할 수 있어 코드량이 많아질 경우 기존 변수의 존재를 잊고 값을 재할당하게 되는 일이 발생할 수 있다는 단점이 있습니다. 반면 let과 const는 같은 이름의 변수
를 여러번 선언할 수 없고, let은 재할당이 가능하지만 const는 재할당이 불가능하다는 차이, 즉 immutable
여부의 차이가 존재합니다.
그리고 scope
측면에서도 차이를 가지는데, var 같은 경우는 함수 레벨 scope(Function-level scope)
, let과 const는 블록 레벨 scope(Block-level scope)
를 가집니다. 함수 레벨 scope
는 기본적으로 함수내에서 선언된 모든 변수에 대해서 지역 변수로 취급하며 이로 인해 의도치 않게 전역 변수를 만들 수 있습니다. 블록 레벨 scope
는 블록 내부에서 선언된 변수는 해당 블록 내부에서만 유효하고 블록 외부에서는 참조할 수 없습니다.
호이스팅
관점에서도 차이를 보이는데, var 같은 경우는 만약 어떤 변수가 선언되기 전에 참조되더라도 오류가 발생하지 않습니다. 그 이유는 호이스팅
과정에서 해당 변수를 미리 선언
하고 undefined
로 초기화
해놓기 때문입니다. 하지만 let과 const 같은 경우 동일한 상황에서 오류가 발생하는데, 이는 변수 선언
만 이루어지고 초기화
과정은 실제 변수 선언문을 만났을 때 수행하기 때문입니다. 호이스팅
은 발생하지만 값을 참조할 수 없기 때문에 오류가 발생합니다.