호이스팅은 인터프리터가 코드를 실행하기 전에 함수, 변수, 클래스 또는 임포트(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을 사용하면 혼란스러운 코드가 생길 수 있다.