🛤️ 호이스팅의 정의
javascript
에서 호이스팅이란, 변수의 선언 및 함수의 선언이 해당 스코프의 최상단으로 끌어 올려진 것과 같은 현상을 뜻한다.
let
이나 const
로 선언한 변수는 선언 전에 접근할 수 없다.var
로 선언한 변수는 선언 전에도 접근할 수 있다
// var 키워드 사용
console.log(foo);// undefined
var foo = 123;
// let키워드 사용
console.log(foo); // ReferenceError
let foo = 123;
위 코드의 결과를 보고 let
과 const
는 호이스팅이 적용되지 않는다 는 오해가 생길 수 있다
let
과 const
도 var
와 같이 호이스팅된다. 그러나 호이스팅 되는 방식은 var
변수와의 차이점이 존재한다. console.log(x) // Reference Error
console.log(y) // Reference Error
let x = 1;
const y = 1
x
와y
를 초기화하기 전에 접근하려고 하면 TDZ
라는 영역에 있어 Reference Error
가 발생한다let
이나 const
로 선언한 변수도 호이스팅으로 인하여 변수가 존재하지만 초기화가 되지않아 접근할 수 없다는것을 의미한다모든 선언(=함수선언문,var,let,const,class)는 호이스팅되며,
var
는 undefined
로 초기화 되지만 let
과 const
는 초기화 되지않은 Temporal DeadZone 상태로 유지된다
선언 단계 (호이스팅이 일어나는 단계)
초기화 단계
undefined
로 초기화된다.할당 단계
🫡
var
와let/const
의 호이스팅 시 차이점
var
로 선언된 변수는 선언과 동시에 초기화가 이루어지는 반면
let
과 const
로 선언된 변수는 선언 단계까지만 호이스팅 된다
선언단계에서 var
와 let/const
var
: 변수 식별자가 스코프에 등록되고 메모리 공간에 할당(호이스팅 발생)let/const
: 변수 식별자가 스코프에 등록되고 메모리 공간에 할당(호이스팅 발생)초기화단계에서 var
와 let/const
var
: 변수가 undefined
로 초기화된다 (이후 할당전까지 유지)let/const
: 변수는 초기화되지 않은 상태로 TDZ(할당 되기전까지의 임시적 사각지대)에 놓여있다let
과 const
로 선언된 변수가 스코프에서 호이스팅 되었지만, 초기화 되기 전까지는 엑세스 할 수 없는 상태를 나타낸다.console.log(age); // ReferenceError: Cannot access 'age' before initialization
let age = 26;
참조에러가 발생한이유는?
let
으로 선언한 age
가 호이스팅 되었지만 초기화 되지 않았기 때문이다.TDZ가 끝나는 시점은?
let x; // 선언 단계
x = 10; // 할당 단계 (동시에 변수의 초기화도 이루어진다.)
let x= 10
이전에 x 변수를 참조하려고하면 TDZ
에 해당하는 부분에서 참조에러가 발생한다x
가 선언되고 10으로 값이 할당되고 초기화된 이후에는 TDZ
에서 벗어나 정상적으로 변수를 참조할 수 있다function example() {
console.log(x); // ReferenceError: Cannot access 'x' before initialization
let x = 10;
console.log(x); // 10 정상적으로 참조가능!
}
example();