window.변수명
으로 접근 불가)일시적 사각지대 (TDZ: Temporal Dead Zone)
스코프의 시작 지점부터 초기화 시작 지점까지 변수를 참조할 수 없는 구간
// 런타임 이전 - 선언 단계 실행, 아직 초기화 X => 참조 불가 (TDZ)
console.log(foo); // ReferenceError: foo is not defined
let foo; // 선언문 - 초기화 단계
console.log(foo); // undefined
foo = 1; // 할당문 - 할당
console.log(foo); // 1
let
으로 선언한 변수는 변수 호이스팅이 발생하지 않는 것처럼 보이지만 그렇지 않다.
let foo = 1;
{
console.log(foo); // ReferenceError: Cannot access 'foo' before initialization
let foo = 2;
}
만약 호이스팅이 발생하지 않는다면 위 예제는 전역 변수 foo의 값을 출력해야 한다. 현재 스코프 내에 선언된 foo가 없으므로 상위 스코프의 foo를 찾아내 출력해야하기 때문이다. 그러나 호이스팅이 일어난 상태이므로, 선언은 되어있지만 초기화가 되지 않아서 참조할 수 없다는 에러가 발생한다.
var
, let
은 가능) => 상수 표현을 위해 많이 사용// 변수명 대문자로 선언해 상수임을 명시함
const TAX_RATE = 0.1;
let preTaxPrice = 100;
let afterTaxPrice = preTaxPrice + (preTaxPrice * TAX_RATE); // 110
const person = {
name: 'Lee'
};
// 객체는 변경 가능한 값 => 재할당 없이 변경 가능
person.name = 'Kim';
var
는 사용 Xconst
사용let
사용 (변수의 스코프는 최대한 좁게)