이 주제를 한 문장으로 설명하면? (예: "브라우저가 HTML을 받아서 화면에 그리는 전체 과정")
한 줄 요약:
자바스크립트 코드 실행 전에 변수와 함수 선언이 스코프의 최상단으로 끌어올려지는 것처럼 동작하는 개념
개념 설명:
동작 원리 / 흐름을 포함하여 설명해주세요.
자바스크립트는 소스코드를 “소스코드 평가”와 “소스코드 실행” 과정으로 나누어 처리합니다.
먼저, 소스코드 평가 과정에서
이후 소스코드 실행 단계에서 코드를 위에서부터 순차적으로 실행하며 변수나 함수가 필요할 때 실행 컨텍스트의 스코프를 통해 해당 식별자를 참조합니다.
이 과정에서 선언문이 먼저 처리되는 현상을 호이스팅이라고 합니다. var, let, const, function, function* , class 키워드를 사용해서 선언된 식별자는 모두 호이스팅됩니다. 다만, 호이스팅은 선언만 끌어올려질 뿐 초기화는 실제 코드 위치에서 수행됩니다.
실제 코드 예시:
console.log(a); // undefinedvar a = 10;// 실제로는 아래처럼 해석되어 동작var a; // 선언 먼저console.log(a); // undefineda = 10
개념 설명:
동작 원리 / 흐름을 포함하여 설명해주세요.
자바스크립트에서 변수 선언 키워드에 따라 호이스팅 방식은 같지만 값의 할당에서 차이가 존재합니다.
| 선언 키워드 | 초기값 | TDZ 존재 | 재할당 |
| var | undefined | X | O |
| let | X (TDZ) | O | X |
| const | X (TDZ) | O | X |
실제 코드 예시:
console.log(a); //undefinedvar a = 1;
실제 코드 예시:
console.log(a)
개념 설명:
동작 원리 / 흐름을 포함하여 설명해주세요.
함수는 선언 방식에 따라 호이스팅 동작 방식이 달라집니다. function 키워드로 이름 있는 함수 정의하는 함수 선언식은 함수 전체가 호이스팅되므로 선언 전에 호출해도 정상 동작합니다.
실제 코드 예시:
foo(); // 실행됨function foo() {console.log("hello");}
함수를 값처럼 변수에 할당하는 함수 표현식은 변수에 함수를 담느 방식으로 변수 선언만 올라가고 함수 본문은 호이스팅 되지 않아 선언 전 호출 시 에러가 발생합니다.
실제 코드 예시:
// var에 할당foo(); // TypeError: foo is not a functionvar foo = function() {console.log("hello");};// let/const에 할당
이 기술/개념이 왜 이런 방식으로 만들어졌는지 배경을 이해해봅시다
실제 프로젝트에서 마주칠 수 있는 상황을 생각해봅시다
// var 사용으로 인한 의도치 않은 동작 유발if (!user) {var user = "guest";}console.log(user); // 의도치 않은 동작
면접관 앞에서 말하듯이 작성. 읽는 용도가 아니라 말하는 연습을 위한 섹션입니다
호이스팅은 자바스크립트 엔진이 코드를 실행하기 전에 변수와 함수 선언을 먼저 처리하는 동작입니다.이 과정에서 var는 undefined로 초기화되지만, let과 const는 TDZ 때문에 초기화 전까지 접근할 수 없습니다. let과 const는 선언 전 접근 시 ReferenceError가 발생합니다.또한 함수 선언문은 전체가 호이스팅되어 어디서든 호출이 가능하지만, 함수 표현식은 변수 호이스팅 규칙을 따르기 때문에 선언 전 호출을 하면 에러가 발생합니다.
면접관이 바쁠 때, 딱 1분 안에 설명하는 버전도 만들어봅시다
호이스팅은 자바스크립트에서 코드 실행 전에 선언문이 먼저 처리되는 동작입니다.var는 undefined로 초기화되고, let과 const는 TDZ 때문에 접근 시 에러가 발생합니다.또한 함수 선언문은 완전히 호이스팅되지만 함수 표현식은 변수처럼 동작합니다.
각 질문에 대해 STAR 구조 혹은 두 문장 요약으로 작성
Q1. 호이스팅이 무엇인지 설명해주세요
A: 자바스크립트 엔진이 코드 실행 전 단계에서 변수와 함수 선언을 먼저 처리하는 동작입니다. 단, 선언만 처리되고 초기화는 원래 위치에 남아 있습니다.
Q2. var, let, const의 호이스팅 차이는 무엇인가요?
A: 세 키워드 모두 호이스팅은 됩니다. var는 undefined로 자동 초기화되어 선언 전 접근해도 에러가 발생하지 않지만, let과 const는 TDZ에 의해 선언 전 접근 시 ReferenceError가 발생합니다.
Q3. 함수 선언식과 함수 표현식의 호이스팅 차이가 있을까요?
A: 네. 있습니다. 함수 선언식은 함수의 이름과 본문 전체가 호이스팅되어 선언 전에 호출해도 정상 동작합니다. 함수 표현식은 변수에 함수를 담는 방식이라 변수 호이스팅 규칙을 따릅니다. var로 선언된 함수 표현식을 선언 전에 호출하면 TypeError가, let/const면 ReferenceError가 발생합니다.
Q4. 호이스팅은 실제로 코드가 위로 올라가는 건가요?
A: 아닙니다. 코드가 물리적으로 이동하는 것이 아니라 실행 컨텍스트 생성 시 엔진이 변수 및 함수 선언을 미리 메모리에 등록하는 것입니다. 코드 원본은 변하지 않으며 엔진의 내부 처리 순서가 다를 뿐입니다.
Q5. TDZ가 왜 필요한가요?
A: var처럼 선언 전 접근 시 undefined를 반환하면 개발자가 버그를 인지하지 못한 채 코드를 짜기 쉽습니다. TDZ는 선언 전 사용을 명시적 에러로 알려주어 의도치 않은 사용을 방지하고 코드 예측 가능성을 높이기 위해 ES6에서 도입되었습니다.
Q6. let/const도 호이스팅이 된다는 증거가 있나요? A: 만약 let이 호이스팅 되지 않는다면 아래 코드에서 console.log(x)는 상위 스코프의 x인 10을 출력해야 합니다. 하지만 실제로는 에러가 발생하므로 엔진은 이미 해당 블록 안에 x라는 이름이 선언될 것임을 알고있다는 의미가 됩니다.
let x = 10;{// 만약 호이스팅이 안 된다면 10이 출력되어야 함console.log(x); // ReferenceError: Cannot access 'x' before initializationlet x = 20;}
// 아래 코드의 출력 결과를 예측하고 실제로 실행해보세요console.log(a)console.log(b)console.log(c())console.log(d)var a
공부하고 나서 진짜 내 머릿속에 남은 것들만 정리해봅시다
| 헷갈린 것 | 알고 보니 |
| 키워드에 따라 출력 결과가 다른 것 | 변수도 키워드에 따라 호이스팅 방법이 다르고 함수도 선언 방식에 따라 다르다. 특히, ES6에서 TDZ가 도입되면서 ES6 문법에 호이스팅 차이가 존재한다 |