호이스팅에 대한 고찰

pengooseDev·2023년 4월 26일
1
post-thumbnail

호이스팅 언제 발생하는가?

실행 컨텍스트 생성 단계에서 발생함.

  1. callStack에 마운팅된다.
  2. 실행 컨텍스트가 열린다.
  3. 함수의 호이스팅이 발생한다.

왜 발생하는가?

조금은 이상해보이는 이 호이스팅은 "필요하니까" 구현된 것이다.
어디에 필요한가?를 고민해보면 왜 발생하는지를 추론할 수 있다.

실행 컨텍스트가 열릴 때, 수집되는 정보들을 고려해보자.

  • 데이터 참조 및 사용
  • 렉시컬 스코프(scopeChaining) 환경 확인 (참조)
  • Closure 형성 (참조) 등 . . .

결국 "참조"다. 우리의 코드는 항상 변수영역에 저장되어있는 메모리 주소의 데이터 영역의 값을 참조하며 돌아간다.
즉, 코드의 로직을 확인하기 위해, 가장 먼저 선행되어야 하는 불변값과 참조 데이터들을 각각 스택 메모리, 힙 메모리에 저장공간을 확보하고 각 함수의 lexicalScope(Scope Chain) 정보 등을 저장하기 위해 호이스팅이 발생한다는 것이다.


변수의 호이스팅

  • const, let, var 변수는 전부 호이스팅이 발생한다.
  • keyword가 없는 경우, GlobalScope(window 객체)에 저장되며, 호이스팅이 발생하지 않는다.
const a = 1; // 호이스팅 O
let b = 2;   // 호이스팅 O 
var c = 3;   // 호이스팅 O
d = 4;       // 호이스팅 X

변수의 초기화(선언과 할당)

  • const, let, var 전부 선언(메모리 공간 확보)이 발생한다.
  • var의 경우에만 선언과 동시에 undefined를 할당한다. (초기화)
  • const와 let의 경우, 선언만 발생하기 때문에 변수에 할당하는 코드까지 TDZ(Temporary Dead Zone)이 발생한다.

변수 저장 위치

(스택 메모리, 힙 메모리를 논하는 것이 아니라, 변수가 저장되는 Scope)

1. const, let

  • 함수 외부 : Script Scope
  • 함수 내부 : Local Scope

2. var

  • 함수 외부 : Global Scope(window 객체)
  • 함수 내부 : Local Scope

3. 키워드 없이 선언

  • 함수 외부 : Global Scope
  • 함수 내부 : Global Scope

0개의 댓글