var : 중복 선언 가능
let / const : 중복 선언 불가능
var / let : 값의 재할당이 가능
const : 값의 재할당이 불가능
스코프란 유효한 참조 범위
를 말한다. 예를 들어, 함수 내부에서 선언된 변수는 함수 내부에서만 참조가 가능하다.
자바스크립트는 var로 선언한 변수의 스코프와 let, const로 선언한 변수의 스코프가 다르다.
스코프 측면에서 var는 함수 내부에 선언된 변수만 지역 변수로 인정하는 함수 레벨 스코프이고, let, const는 블록 내부에서 선언된 변수까지도 지역변수로 인정하는 블록 레벨 스코프이다.
function func() {
if (true) {
var a = "a";
console.log(a); // a
}
console.log(a); // a
}
console.log(a) // Uncaught ReferenceError : a is not defined
func();
function func() {
if (true) {
let a = "a";
console.log(a); // a
}
console.log(a);
// Uncaught ReferenceError : a is not defined
}
func();
코드 실행되면 undefined 가 반환된다.
에러가 발생하지 않는 이유는 호이스팅 때문이다.
JS 인터프린터는 변수 생성의 선언단계
와 할당단계
를 분할
한다.
선언 부분은 코드 실행 전 현재 범위의 맨 위로 호이스팅 되고 초기 undefined 값이 할당된다.
선언단계 : undefined / 할당단계 : hello 값이 할당
var 경우
console.log(greeting); // undefined
var greeting = "hello";
func(); // hoisting test
function func() {
console.log("hoisting test");
}
TDZ(temporal Dead Zone)
이라고 한다.차이점
var : 실제 할당 값이 할당 되기전까지 undefined 값이 할당된다.
let/ const : 변수 초기에 어떤 값도 할당되지 않는다.
console.log(greeting);
// Uncaught ReferenceError: Cannot access 'greeting' before initialization
let greeting = "hello";
결론은 변수 생성할 때 재할당이 필요없다면 const를 사용한다.
재할당이 필요할 경우 let을 사용하지만 변수 scope를 최대한 좁게 만들어 사용하는것이 좋다.