var는 함수 스코프를 가진다. 즉, 함수 내에서 선언된 변수는 함수 내부에서만 접근이 가능하다.
function myFunction() {
var localVar = "나는 이 함수에 국한되어 있어요";
console.log(localVar); // 함수 내부에서 localVar를 출력한다. 결과: "나는 이 함수에 국한되어 있어요"
}
myFunction();
console.log(localVar); // 함수 외부에서 localVar에 접근하려고 하면 에러가 발생한다. 결과: ReferenceError: localVar is not defined
let과 const는 블록 스코프를 가진다. 즉, 중괄호 {} 내에서 선언된 변수는 해당 블록 내에서만 접근이 가능하다.
{
// blockScopedVar 변수를 블록 내부에서 선언한다.
let blockScopedVar = "나는 이 블록에 국한되어 있어요";
// 블록 내부에서 blockScopedVar를 출력한다.
console.log(blockScopedVar); // 결과: "나는 이 블록에 국한되어 있어요"
}
// 블록 외부에서 blockScopedVar에 접근하려고 하면 에러가 발생한다.
console.log(blockScopedVar); // ReferenceError: blockScopedVar is not defined
호이스팅(Hoisting)
var는 변수 선언이 호이스팅되어 선언된 변수는 초기화되지 않은 상태로 위로 끌어올려진다. 초기값은 undefined이다.
let과 const도 호이스팅되지만, 초기화 전에는 접근할 수 없고 접근 시 에러가 발생한다. 이를 일시적 사각지대(TDZ, Temporal Dead Zone)라고 한다.