호이스팅은 '끌어올리기'이다.
자바스크립트의 실행 컨텍스트를 이해했다면 이 개념 또한 이해할 수 있다.
자바스크립트로 코드를 작성하다보면 var
키워드로 변수를 선언했을 때 이상한 경험을 하게 된다.
console.log(num)
var num = 10;
위 코드의 결과 undefined
가 출력되게 된다.
아직 선언과 초기화가 이루어지지 않은 변수 num
에 대해서 undefined
아직 정의되지 않았다는 값이 초기화되어 있는 것이다.
이전에 실행 컨텍스트를 이해하면서, 실행 컨텍스트의 2가지 단계에 대해서 알아봤다.
다시 떠올려보면, Creation phase, 실행 전 단계에서 실행 컨텍스트를 생성하고, 변수의 선언과 함수의 선언을 먼저 입력하는 단계가 있었다.
이로 인해 변수가 끌어올려져 먼저 선언된 것 같은 호이스팅을 볼 수 있는 것이다.
console.log(num)
var num = 10;
num
이라는 변수를 VO(Variable object)에 선언한다. undefined
상태console.log(num)
이 실행되어 undefined
를 출력한다.num
에 값을 할당한다.var
의 경우 이렇게 진행되지만, let
과 const
는 다르다.
let
과 const
는 호이스팅 대상이 되지만 undefined
로 초기화되지 않고, 초기화 이전 사용된다면 Reference Error
가 발생한다.
이는 시간상 사각지대 (Temporal Dead Zone, TDZ)의 이해가 필요하다.
자바스크립트의 다양한 자유도 덕분에 개발 상 문제가 될 수 있다.
호이스팅과 같이 초기화되지 않은 변수를 가져다 쓸 수 있다거나, 변수의 오타를 전역변수로 생성해 사용한다던가, 여러가지 이유로 엄격한 모드 (strict mode)를 사용하도록 할 수 있다.
'use strict'
// 코드
코드 상단에 'use strict'
를 통해 사용할 수 있다.