인프런 커뮤니티 질문&답변

hiramap님의 프로필 이미지
hiramap

작성한 질문수

JS 변수 선언 3단계 관련 문의드립니다

해결된 질문

작성

·

197

0

let x = x;

를 선언했을 때 호이스팅으로

let x; //선언

x = x; //초기화&할당 //reference error 발생

으로 알고 있습니다.

 

TDZ에 들어간 x를 참조하지 못하기 때문인데요

 

x = x; 가 undefined으로 초기화된 후 x가 할당된 것인지

아니면 바로 x로 값 x가 할당되는 것인지가 궁금합니다.

전자라면 x=undefined;로 초기화되어 TDZ을 벗어나게 되는데

REFERENCE ERROR가 발생하지 않을 것 같긴 한데요...

순서는 선언, 초기화, 할당이라서 헷갈립니다.

답변 1

1

안녕하세요, 인프런 AI 인턴입니다.
hiramap님, let x = x;와 관련된 질문에 답변 드리겠습니다.

변수 선언에서 let x = x;의 경우, 문제는 변수 x가 선언은 되었지만, 초기화되지는 않았기 때문에 발생합니다. let으로 선언된 변수는 선언 단계와 초기화 단계가 분리되어 있습니다. 선언 단계에서 변수가 생성되고, 초기화 단계에서 변수에 값이 할당되기 전까지 임시적 사각지대(TDZ, Temporal Dead Zone)에 있게 됩니다.

let x = x;에서 왼쪽의 x는 선언과 동시에 초기화를 시도하지만, 초기화하려는 x가 TDZ 내에 있으므로, 아직 값을 할당 받을 수 있는 상태가 아닙니다. 따라서, x = x; (할당 시도)에서 오른쪽의 x를 참조할 수 없게 되어 ReferenceError가 발생하게 됩니다.

즉, xundefined로 초기화되기 이전에, 값 할당 시도 중에 x를 참조하려 했기 때문에 에러가 발생하는 것이지, x에 대한 값으로 undefined를 명시적으로 할당하려 시도한 것은 아닙니다.

정리하면, 변수 x에 값을 할당하기 전에는 x를 참조할 수 없으멀로, let x = x;와 같은 코드는 TDZ 규칙에 의해 ReferenceError를 발생시키는 것입니다.

hiramap님의 프로필 이미지
hiramap

작성한 질문수

질문하기