호이스팅은 인터프리터가 코드를 실행하기 전에 함수, 변수, 클래스 또는 임포트(import)의 선언문을 해당 범위의 맨 위로 끌어올리는 것처럼 보이는 현상을 뜻합니다.
hoisting : 끌어 올리기, 들어올려 나르기.
스코프(함수) 안에 존재하는 모든 선언들을 해당 스코프의 최상단으로 끌어올리는 것이다.
자바스크립트 엔진은 코드를 실행하기 전에 실행 가능한 코드를 형상화하고 구분하는데, 이 과정에서 코드 실행을 위한 모든 선언을 메모리에 저장한다.
호이스팅 대상은 두 가지이다.
선언 단계
, 초기화 단계
, 할당 단계
를 동시에 실행한다.test();
function test() {
document.writeln("Hoisting");
}
test()
보다 아래에 작성되어 있으므로 실행되지 않아야 할 것 같지만, 호이스팅
때문에 정상적으로 작동한다.console.log(value) //선언과 동시에 undifined로 초기화
var value = 'Hello World'
console.log(value) //Hello World
const
와 let
의 경우 ReferenceError
가 발생한다.let
과 const
로 선언한 변수는 호이스팅되었지만, 접근할 수는 없다....
console.log(value)
let value = 'Hello World' //ReferenceError
...
console.log(value)
const value = 'Hello World' //ReferenceError
console.log(value)
가 작성된 라인을 TDZ
로 여겨, 선언문이 나오기 전까지는 접근할 수 없게 되었을 뿐이다.TDZ(일시적 사각 지대)
라고 한다.자바스크립트는 총 3단계에 걸쳐서 변수를 생성합니다.
선언 단계(Declaration phase)
초기화 단계(Initialization phase)
할당 단계(Assignment phase)
선언
단계와 초기화
단계를 동시에 진행한다.할당
하기 전에 호출해도 undifined로 호출되는 호이스팅이 발생한다.선언
단계와 초기화
단계가 분리된다.ReferenceError
가 발생한다.코드의 가독성과 유지보수를 위해 호이스팅이 일어나지 않도록 한다.
가급적 let
과 const
를 사용한다.
var
을 사용하면 혼란스러운 코드가 생길 수 있다.