호이스팅이란?

미어캣의 개발일지·2023년 6월 25일
0

📚 호이스팅

📕 호이스팅이란?

인터프리터가 변수와 함수의 메모리 공간을 선언 전에 미리 할당하는 것

  • 호이스팅은 코드를 실행하기 전 변수선언/함수선언을 해당 스코프의 최상단으로 끌어올리는 것이 아닌 끌어올려진 것 같은 현상을 말한다.

  • 자바 스크립트 엔진은 코드릴 실행하기 전 실행 가능한 코드를 형상화하고 구분하는 과정(실행 컨텍스트를 위한 과정)을 거치며 그 과정에서 모든 선언(var, let, const, function, class)을 스코프에 등록한다.

  • 코드 실행 전 이미 변수선언/함수선언이 저장되어 있기 떄문에 선언문보다 참조/호출이 먼저 나와도 오류 없이 동작한다.

📕 변수 호이스팅 (var, let, const 키워드)

  • 자바 스크립트의 모든 선언에는 호이스팅이 일어난다.

  • var키워드로 선언된 변수와는 달리 let 키워드로 선언된 변수를 선언문 이전에 참조하면 참조 에러(ReferenceError)가 발생한다.

  • var키워드는 선언과 함께 undefined로 초기화되어 메모리에 저장 letconst는 초기화되지 않은 상태로 선언만 메모리에 저장된다.

  • 초기화 되지 않으면 변수를 참조할 수 없다. 그래서 참조 에러가 발생

📕 변수는 어떻게 생성되며, 호이스팅은 어떻게 이뤄질까

📖 1단계: 선언 단계

  • 변수를 실행 컨텍스트의 변수 객체에 등록
  • 이 변수 객체는 스코프가 참조하는 대상이 된다.

📖 2단계: 초기화 단계

  • 변수 객체에 등록된 변수를 위한 공간을 메모리에 확보
  • 이 단계에서 변수는 undefined로 초기화 된다.

📖 3단계: 할당 단계

  • undefined로 초기화된 변수에 실제 값을 할당한다.

  • var 키워드로 선언한 변수는 선언 단계와 초기화 단계가 한번에 이뤄진다.
  • let 키워드로 선언된 변수는 선언 단계와 초기화 단계가 분리되어 진행된다.
  • 초기화 이전에 변수에 접근하려고 하면 참조 에러가 발생한다. 이는 아직 변수가 초기화되지 않았기 때문이다. 즉, 변수를 위한 메모리 공간이 아직 확보되지 않았기 때문이다.

📕 참조

https://developer.mozilla.org/ko/docs/Glossary/Hoisting > https://gmlwjd9405.github.io/2019/04/22/javascript-hoisting.html > https://hanamon.kr/javascript-%ED%98%B8%EC%9D%B4%EC%8A%A4%ED%8C%85%EC%9D%B4%EB%9E%80-hoisting/

profile
이게 왜 안되지? 이게 왜 되지?

0개의 댓글