- 0
- 2
자바스크립트의 호이스팅(Hoisting)
답변 확인
1. 호이스팅(Hoisting)이란?
- 호이스팅은 자바스크립트가 코드를 실행하기 전에 변수와 함수의 선언을 코드의 최상단으로 끌어올리는 것처럼 동작하는 특징
- 이로인해, 코드에서 변수를 선언하기 전에 사용할 수 있는 것처럼 보일 수 있지만 값이 할당은 호이스팅되지 않음
2. var
, let
, const
와 호이스팅
특성 | var |
let |
const |
---|---|---|---|
호이스팅 | 선언과 초기화가 동시에 호이스팅됨 | 선언만 호이스팅됨 | 선언만 호이스팅됨 |
초기화 시점 | 선언 시 undefined 로 초기화 |
초기화는 선언 이후 해당 코드가 실행될 때 | 초기화는 선언 이후 해당 코드가 실행될 때 |
TDZ (Temporal Dead Zone) | 없음 | 존재 | 존재 |
초기화 전 접근 | undefined 반환 |
ReferenceError 발생 | ReferenceError 발생 |
재선언 가능 여부 | 가능 | 불가능 | 불가능 |
재할당 가능 여부 | 가능 | 가능 | 불가능 |
var
와 호이스팅
var
는 선언과 초기화가 동시에 호이스팅됨- 선언된 변수는 초기화 시점 이전까지
undefined
로 평가됨
console.log(myVar); // undefined (호이스팅됨)
var myVar = 10;
console.log(myVar); // 10
let
과 const
와 호이스팅
let
과const
도 선언은 호이스팅되지만, 초기화는 호이스팅되지 않음- **TDZ(Temporal Dead Zone)**가 존재하여, 선언된 시점부터 초기화되기 전까지 변수에 접근하면 ReferenceError가 발생
console.log(myLet); // ReferenceError 발생
let myLet = 10; // 초기화
console.log(myLet); // 10
3. 함수와 호이스팅
-
함수 선언식
- 함수 선언식은 함수 전체가 호이스팅 되므로 선언 이전에 호출이 가능함
console.log(myFunction()); // 'Hello World' 출력
function myFunction() {
return 'Hello World';
}
- 함수 표현식 (
var, let, const
사용)- 함수 표현식은 변수의 호이스팅 규칙을 따름
var
는undefined
로 평가되고,let
과 const는 TDZ로 인해 ReferenceError가 발생
console.log(myFunc); // undefined (var 사용)
var myFunc = function () {
return 'Hi';
};
console.log(myFunc()); // 'Hi'
console.log(myLetFunc); // ReferenceError 발생
let myLetFunc = function () {
return 'Hello';
};
4. Temporal Dead Zone (TDZ)
- TDZ는 변수가 선언된 시점부터 초기화되기 전까지의 구간
- 이 구간에서는 변수에 접근할 경우 ReferenceError가 발생
- TDZ는
let
과const
의 주요 특징 중 하나로, 코드의 안전성을 높여줌
{
// TDZ 시작
console.log(myLet); // ReferenceError 발생
let myLet = 20; // 초기화
console.log(myLet); // 20
// TDZ 종료
}
결론
- 호이스팅이란?
- 변수와 함수 선언이 코드 최상단으로 끌어올려지는 자바스크립트의 특징
var
,let
,const
와 호이스팅
var
: 선언과 초기화가 동시에 호이스팅 (undefined로 초기화)let/const
: 선언만 호이스팅되고 초기화는 나중에 이루어짐 (TDZ 존재)
- 함수
- 함수 선언식: 선언 이전에 호출 가능.
- 함수 표현식: 변수가 호이스팅 규칙을 따름 (
var
: undefined,let/const
: ReferenceError).
- 최선의 사용법
- 기본적으로
const
를 사용. - 재할당이 필요한 경우에만
let
사용. var
는 사용을 지양하여 의도치 않은 오류를 방지.
Top comments (2)
- DavidYang2월 19일
우와 댓글이다~
- Olivia2월 19일
오오 ~~ :) 너무 글 좋네용