
console.log(a);
var a = 2;
var a = 2;를 2개의 구문으로 나눈다.var a;와 a = 2;var a;는 변수 선언문에 해당한다.a = 2;는 실행할 때까지 냅둔다.a는 호이스팅이 되고 콘솔에는 아래와 같은 결과가 출력된다.undefined → 변수 선언문만 호이스팅되고 초기화가 안 되었기 때문.hello(); // "Hello!" 정상 출력
function hello() {
console.log("Hello!");
}
function 함수이름() {} 형태로 작성한다.hello(); // TypeError: hello is not a function
var hello = function () {
console.log("Hello!");
};
var hello는 호이스팅 되면서 undefined로 초기화된 상태이다. 함수 대입은 호이스팅 되지 않기 때문에, 선언 전에 호출하면 undefined를 함수로 호출하는 꼴이 되어 TypeError가 발생한다.undefined로 초기화 → undefined를 함수로 호출 → TypeErrorReferenceErrorlet, const도 호이스팅 자체는 된다.let, const는 초기화 전에는 접근 자체가 불가능하다.ReferenceError가 발생한다.let, const로 선언된 변수가 호이스팅은 되었지만, 초기화되기 전까지 접근할 수 없는 구간을 TDZ(Temporal Dead Zone) 라고 한다.ReferenceError가 발생하는 이유가 바로 이 TDZ 때문이다.호이스팅이란 변수 및 함수 선언문이 스코프 내 최상단으로 끌어올려지는 현상을 말합니다. JavaScript 엔진은 코드를 실행하기 전에 컴파일 단계를 거치는데, 이때 실행 컨텍스트가 생성되면서 렉시컬 스코프 내의 선언들이 먼저 수집됩니다. 이 과정에서
var로 선언된 변수는 선언부만 끌어올려지고 대입문은 그대로 남기 때문에 선언 전에 접근하면undefined가 출력됩니다. 함수 선언문은 통째로 호이스팅 되지만, 함수 표현식은 변수처럼 취급되어undefined로 초기화된 상태이므로 선언 전에 호출하면TypeError가 발생합니다.let과const도 호이스팅 자체는 되지만 TDZ(Temporal Dead Zone)로 인해 초기화 전까지 접근이 불가능하여ReferenceError가 발생합니다. 이처럼TypeError는 값은 있지만 함수가 아닌 것을 호출할 때,ReferenceError는 변수 자체에 접근할 수 없을 때 발생하는 것이므로 그 차이를 명확히 이해하는 것이 중요합니다.
댓글을 작성하려면 로그인이 필요합니다.
아직 작성된 댓글이 없어요. 첫 댓글을 남겨주세요!