var
/let
/const
var와 let은 재할당이 가능하지만 const는 불가능하다.
var는 복수 선언이 가능하지만 let과 const는 한번만 선언할 수 있다.
- 변수 이름 중복선언 가능,
- 변수 선언 전에 사용 가능(호이스팅),
- 함수 스코프
특히나 중복된 이름으로 선언이 가능했던 특징은 여러 사람이 협업할 때 생각보다 자주 문제가 되었고 이런 문제를 개선하기 위해 ES2015에서 let과 const가 등장했다.
- 변수 이름 중복선언 불가 (SyntaxError 발생)
- 변수 선언 전에 사용 불가 (ReferenceError 발생)
- 블록 스코프
var 의 경우 함수 스코프에서 작동, let과 const는 블럭스코프 안에서 작동힌다. 함수 스코프란 말 그대로 함수를 기준으로 스코프를 구분한다는 뜻인데 그렇기 때문에 아래 함수 안에서 선언한 변수는 함수 안에서만 유효하게 된다. 하지만 함수를 제외한 for, if, while 등과 같은 문법 안에서 선언한 변수는 그 문법 밖에서도 계속 유효했었기 때문에 중복선언이나 메모리 누수 등의 문제가 발생하였고 이런 문제를 해결하기 위해 let과 const 키워드와 함께 블록 스코프가 등장하게 되었다. 블록스코프란 중괄호로 감싸진 코드 블록에 따라 유효범위를 구분하게 되는 것을 말한다.
// let과 const는 블럭 레벨 안에서만 작동하기 때문에 console.log(k)호출에 에러가 발생
function scope(){
if(true){
let k = 123
}
console.log(k)
}
scope() // ReferenceError k is not defined
------
// var는 함수 레벨 안에서 작동하기 때문에 console.log(k)가 에러없이 출력된다.
function scope(){
if(true){
var k = 123
}
console.log(k)
}
scope() // 123