호이스팅이란?
함수 안에 있는 선언들을 모두 끌어올려서 해당 함수 유효 범위의 최상단에 선언하는 것.
- 자바스크립트
paser
가 함수 실행 전 해당 함수를 한번 훑는다.- 함수 안에 전재하는 변수/함수선언에 대한 정보를 기억하고 있다가 실행.
실제 코드가 끌어올려지는 건 아니며, 자바스크립트 parser` 내부적으로 끌어올려서 처리하는 것
(실제 메모리에서는 변화가 없다.)
- 코드가 실행될 때 실행 컨텍스트를 생성하게 된다. 실행 컨텍스트는 해당 함수가 실행되기 위한 환경을 구축하는 것이다.
그 중에서 함수의 실행에 선언 된 것을 찾기 위한 객체가 변수 객체인데 이를 셋팅하기 위해 발생한다.- 호이스팅은 선언에만 발생하기 때문에 함수 선언식에서는 발생하지만, 표현식에서는 발생하지 않는다.
함수도 객체이며 이를 변수에 담는 것도 할당에 해당하기 때문이다.
var
, let
, const
- 대게
var
는 호이스팅이 발생하고let
,const
는 호이스팅이 발생하지 않는 것으로 알고 있다.let
,const
같은 경우도 호이스팅이 발생한다. 다만, 차이점은var
같은 경우 선언과 동시에undefined
가 할당되어 초기화가 발생하기 때문에 에러없이 접근이 가능하다.
let
, const
는 어휘적 바인딩이 실행되기 전까지 접근할 수 없는 TDZ 현상이 발생한다.undefined
가 할당된다.TDZ 란?
선언전에 변수에 접근하는 것을 금지하는 규칙이다.
const
let
class
parameter
: function (a = b , b) { ... }
constructor()
내부의 super()
super()
호출하기 전까지 this
바이딩이은 TDZ에 있다.