호이스팅
호이스팅: 자바스크립트 엔진이 코드 실행 전 변수와 함수의 선언부를 스코프의 최상단으로 끌어올리는 동작. 면접단골
자바스크립트는 인터프리터 기반 언어로, 코드를 순차적으로 실행하지만 호이스팅으로 인해 선언부가 먼저 처리됨.
변수와 함수 호이스팅 시 처리 방식
-
변수 호이스팅
console.log("name");
console.log("age");
var name = "윤지";
var age = 24;
- var: undefined로 초기화됨
- let과 const: 초기화되지 않은 상태로 메모리에 등록, 일시적 사각지대(TDZ)에 진입
- 코드 실행 중 명확한 값 할당 시에만 에러 없이 접근 가능함
-
함수 선언식 호이스팅
print();
function print() {
console.log("a");
}
- 함수 전체가 메모리에 등록됨
- 코드의 어디에서든 호출 가능함
-
함수 표현식의 호이스팅
print();
const print = function () {
console.log("a");
};
- 변수 선언부만 호이스팅되고, 변수에 undefined 할당 (var로 선언 시)
- let이나 const로 선언된 함수 표현식은 초기화되지 않은 상태로 TDZ에 머무름
- 선언 이전 호출 시 에러 발생함
실행 컨텍스트와 스코프
호이스팅의 발생 이유 이해를 위해 실행컨텍스트에 대한 이해 필요
실행 컨텍스트
실행컨텍스트: 자바스크립트를 실행하는 독립적인 공간
실행 컨텍스트의 역할과 중요성
실행 컨텍스트: 자바스크립트 코드 실행 환경. '레코드' 공간에 변수와 함수 이름을 미리 기록하여 다음 기능 수행:
- 변수와 함수의 쉬운 접근성 보장
- 코드의 예측 가능한 동작 지원
- 변수 검색 우선순위 설정

구성 요소
실행 컨텍스트의 두 가지 주요 구성 요소:
Record: 변수와 함수 선언을 저장하는 컴포넌트
Outer: 상위 스코프를 연결하는 통로
- 내부 스코프에서 변수 찾을 때, 상위 스코프(외부 환경)를 순서대로 탐색
- 이 과정을
스코프 체이닝이라고 함
- 최종적으로 전역 스코프까지 찾아가고, 거기에도 없으면 "name is not defined" 에러 발생
실행 컨텍스트 순서
- 생성: 변수, 함수 선언 부분 기록
- 변수를 선언하고 초기화
- var 변수: undefined 할당
- let/const 변수: 초기화되지 않은 상태로 TDZ에 존재
- 일시적 사각지대(TDZ): 선언부터 초기화 전까지의 구간
- this 키워드를 바인딩
- 스코프 범위 결정
- 실행: 선언 부분 참조하여 실행
- 전역 컨텍스트에서 실행 중 함수 만나면 함수 실행 컨텍스트 생성하여 스택에 추가
주요 유형
- 전역 실행 컨텍스트: 자바스크립트 프로그램이 처음 시작될 때 만들어지는 기본 컨텍스트
- 함수 실행 컨텍스트: 함수가 호출될 때마다 생성되는 컨텍스트
콜 스택
콜 스택: 실행 컨텍스트를 관리하는 자료구조

콜스택
- 프로그램 실행 시 '전역 실행 컨텍스트' 생성 및 스택에 '푸시'
- 스택은 후입선출 방식으로 작동, 마지막에 쌓인 것을 먼저 처리
- 함수 호출 시마다 해당 함수의 실행 컨텍스트를 스택에 푸시
- 함수 실행 완료 시 해당 컨텍스트를 스택에서 '팝'
- 모든 실행 컨텍스트 처리 및 스택이 비워지면 프로그램 실행 종료

함수 실행 컨텍스트가 스택에 푸시된 상태
푸시(Push)와 팝(Pop)
- 푸시: 스택 최상단에 항목 추가. 콜 스택에서 새 실행 컨텍스트 추가 시 사용.
- 팝: 스택 최상단 항목 제거. 콜 스택에서 함수 실행 완료 시 컨텍스트 제거에 사용.
스코프
스코프: 실행컨텍스트 안에서 실행되는 유효한 범위
하나의 실행컨텍스트가 하나의 스코프를 갖게 됨(실행컨텍스트 ≠ 스코프)
- 전역 스코프: 어디서든 접근 가능한 변수나 함수
- 지역 스코프: 특정 함수 내에서만 접근 가능한 변수나 함수
출처 수코딩