개발자

리액트에서는 호이스팅이 다른이유?

2024년 07월 02일조회 126

순수 자바스크립트에서는 함수선언문으로 만든 경우에만 호이스팅단계에서 선언과 초기화가 코드 실행 전에 이뤄져서, 선언부보다 윗라인의 코드에서 사용할 수 있다고 배웠습니다. 그런데 첨부한 이미지처럼, 리액트에서는 함수형 컴포넌트를 화살표함수로 만들고, const를 사용해서 변수를 선언해도 선언부보다 윗라인의 코드에서 사용이나 참조가 가능한 이유가 뭔가요?? 구글에서 글을 여러개 찾았는데 이야기 하는게 다 달라서 너무 햇갈리고 궁금합니다.

이 질문이 도움이 되었나요?
'추천해요' 버튼을 누르면 좋은 질문이 더 많은 사람에게 노출될 수 있어요. '보충이 필요해요' 버튼을 누르면 질문자에게 질문 내용 보충을 요청하는 알림이 가요.

답변 1

유길종님의 프로필 사진

호이스팅과 TDZ는 같은 실행컨텍스트 레벨에서 유의해야하는 문제입니다. 같은 실행컨텍스트 스코프에서 Layout 이라는 함수를 정의하는 것보다 Layout을 호출하는 것이 더 빠르다면 이는 문제가 됩니다. 그러나 올려주신 예시를 보면 App 함수가 Layout보다 일찍 정의되는 것은 맞지만 Layout이 App 함수에 의해 호출되는 시점은 App 함수가 호출된 이후라는 것을 알 수 있습니다. 그렇기 때문에 이는 문제가 되지 않는 것이며 리액트만의 특수한 동작방식이 아닌 자바스크립트의 동작 원리상 자연스러운 부분입니다.

지금 가입하면 모든 질문의 답변을 볼 수 있어요!

현직자들의 명쾌한 답변을 얻을 수 있어요.

또는

이미 회원이신가요?

AI 답변
커리어리 AI 봇 프로필 이미지

커리어리 AI 봇

GPT가 달아주는 답변입니다.

2024년 07월 02일

리액트에서 화살표 함수나 const를 사용하여 컴포넌트를 정의하더라도, 그 컴포넌트는 상위 코드에서 참조가 가능한 것으로 보입니다. 이는 자바스크립트 호이스팅(hoisting)과는 다른 개념입니다. 호이스팅은 var로 선언된 변수나 함수 선언식을 프로그램 실행 전에 미리 메모리에 할당하는 것을 의미합니다. 그러나 리액트의 컴포넌트와 같은 함수 표현식은 호이스팅 대상이 아니며, let, const도 마찬가지입니다. 그럼에도 불구하고 리액트에서 함수형 컴포넌트가 상위 코드에서 참조 가능한 이유는 웹팩(webpack)이나 바벨(babel)과 같은 모듈 번들러(module bundler) 덕분입니다. 이런 도구들은 import와 export 구문을 해석하고, 모듈 간의 의존성(dependency)를 파악하여 모든 소스 파일을 하나 또는 여러 개의 번들(bundle)로 합치는 역할을 합니다. 따라서, 리액트 앱에서 상위 코드가 하위 코드를 참조할 수 있는 것은 사실상 "코드 실행 순서"와 관련 있지 않습니다. 왜냐하면 모듈 번들러가 전체 프로젝트의 코드를 독립적으로, 그리고 상호 참조가 가능하게 변환하기 때문입니다. 이는 웹 개발에서 자주 사용하는 패턴인데, 다른 파일에서 export된 함수나 컴포넌트를 import하여 사용하는 것이 일반적이기 때문입니다.

목록으로

지금 가입하면 모든 질문의 답변을 볼 수 있어요!