var는 함수 스코프. 함수 내부에서 선언되면 해당 함수 내에서만 접근할 수 있지만, 함수 밖에서 선언된 경우 전역 스코프를 갖는다. if나 for 같은 블록 안에서 선언된 경우에도 함수 단위로 스코프가 제한.
같은 이름으로 여러 번 선언이 가능, 선언을 다시 하면 이전 값을 덮어쓴다.
var로 선언한 변수는 호이스팅, 선언 위치와 관계없이 코드의 최상단으로 끌어올려진 것처럼 작동. 다만, 초기화가 아닌 선언만 끌어올려지기에, 초기화 전에는 undefined 값을 가진다.
console.log(x); // undefined (호이스팅으로 인해 선언은 끌어올려짐)
var x = 5;
let은 블록 스코프. 즉, {}로 감싸진 블록 내에서만 유효, 블록을 벗어나면 접근할 수 없다.
같은 스코프 내에서는 동일한 이름으로 변수를 재선언할 수 없다. (단, 값 재할당은 가능)
let도 호이스팅이 발생하지만, TDZ(Temporal Dead Zone)이라는 개념에 따라 선언 이전에 변수를 사용할 수 없다. 선언 이전에 변수에 접근하면 오류가 발생.
const z = 20;
z = 30; // TypeError (const는 재할당 불가)
const도 블록 스코프.
const로 선언된 변수는 재선언할 수 없고, 선언 후 값을 변경할 수 없다. 즉, 상수로 사용.
const도 let과 마찬가지로 TDZ에 의해 선언 이전에 사용할 수 없다.
function exampleFunction() {
var x = 10; // x는 exampleFunction 내에서만 유효
console.log(x); // 10
}
console.log(x); // ReferenceError: x is not defined (함수 밖에서 접근 불가)
if (true) {
let y = 20; // y는 if 블록 내에서만 유효
console.log(y); // 20
}
console.log(y); // ReferenceError: y is not defined (블록 밖에서 접근 불가)
var로 선언된 변수는 함수 전체에서 유효, 함수 바깥에서는 접근할 수 없다.
let과 const로 선언된 변수는 선언된 블록 {} 내에서만 유효, 블록을 벗어나면 접근할 수 없다.