- var는 함수 스코프를 갖지만 let, const는 블록 스코프를 갖는다.
- var, let은 초기값 없이 선언이 가능하지만 const는 선언 시 초기값이 필요하다.
- var, let은 할당한 변수 값을 재할당 할 수 있지만 const는 한번 할당하면 다른 값을 대입할 수 없다.(const로 선언된 객체 내의 프로퍼티는 변경 가능)
스코프(scope)는 '변수에 접근할 수 있는 범위'를 말한다.
스코프의 종류에는 전역 스코프(global scope)와 지역 스코프(local scope)가 있는데 전역 스코프는 전역에서 선언되어 어디서든 접근이 가능하지만 지역 스코프는 해당 지역 내에서만 접근 할 수 있다.
지역 스코프의 예로는 함수 레벨 스코프와 블록 레벨 스코프가 있다. 자바스크립트에서는 함수를 선언할 때마다 새로운 스코프가 생성이되는데, 이 때 함수 내에서 선언한 변수는 함수 안에서만 접근이 가능한 것이 함수 레벨 스코프의 의미이다. 반면 블록 레벨 스코프는 if문, for문 등에서 사용하는 중괄호에 속하는 범위를 말한다.
아래 예시를 보자.
function run() {
var a = "A";
let b = "B";
console.log(a, b);// A B
{
var c = "C";
let d = "D";
console.log(d);// D
}
console.log(c);// C
console.log(d);// d is not defined
}
var는 함수레벨 스코프이므로 run함수 내에서는 변수 a와 c에 모두 접근이 가능하다. 하지만 let으로 선언된 변수를 보면 b는 함수 안 최상위에서 선언되어 접근이 가능하지만 중괄호 안에서 선언된 d는 중괄호 범위를 벗어난 곳에서는 레퍼런스 에러가 나는것을 볼 수 있다.
var의 경우 문법이 까다롭지 않기 때문에 버그 발생, 메모리 누수의 위험이 있다. 따라서 let과 const를 사용하는 것이 좋다.