부끄럽게도 지금까지 필자는 let과 const는 호이스팅이 되지 않는다고 생각하고 있었다. 면접을 통하여 알게되었으며, 면접을 보고 정말 자극을 받았고 좋은 피드백이었다.
함수 안에 있는 선언들을 모두 끌어 올려서 해당 함수 유효 스코프의 최상단에 선언 하는 것을 말합니다.
변수가 끌어올려 지는 현상을 '호이스팅(hoisting)'이라고 부릅니다
자바스크립트는 ES6의 let, const를 포함하여 모든 선언(var, let, const, function, function*, class)을 호이스팅(Hoisting)한다.
예를 들어, 호이스팅을 변수 및 함수 선언이 물리적으로 작성한 코드의 상단으로 옮겨지는 것으로 가르치지만, 실제로는 그렇지 않습니다. 변수 및 함수 선언은 컴파일 단계에서 메모리에 저장되지만, 코드에서 입력한 위치와 정확히 일치한 곳에 있습니다.
선언 단계(Declaration phase)
변수 객체(Variable Object)에 변수를 등록한다. 이 변수 객체는 스코프가 참조하는 대상이 된다.
초기화 단계(Initialization phase)
변수 객체(Variable Object)에 등록된 변수를 메모리에 할당한다. 이 단계에서 변수는 undefined로 초기화된다.
할당 단계(Assignment phase)
undefined로 초기화된 변수에 실제값을 할당한다.
var키워드를 사용하면 문제점.
var 키워드로 선언된 변수와는 달리 let 키워드로 선언된 변수를 선언문 이전에 참조하면 참조 에러(ReferenceError)가 발생한다.
let 키워드로 선언된 변수는 스코프의 시작에서 변수의 선언까지 일시적 사각지대(Temporal Dead Zone; TDZ)에 빠지기 때문이다.
let과 const 키워드 자체로 모두 호이스팅이 이루어지고 있다. 위와 사항때문에 에러가 발생하는 것이다.
TDZ 시맨틱은 선언 전에 변수에 접근하는 것을 금지한다. TDZ는 징계를 내린다: 변수 선언 전에 어떤 것도 사용하지 않는다.
let으로 선언된 변수는 var 키워드와 다르게 선언단계와 초기화 단계가 분리되어 진행된다.
그러므로 실행컨텍스트에 변수 등록을 했지만, 메모리가 할당되지 않아 접근할 수 없어. 참조에러가 발생하는 것이다.
function 키워드는 3단계를 동시에 진행.
참고자료