호이스팅

null·2022년 8월 1일
0

실행컨텍스트: 실행할 코드에 제공할 환경 정보들 모아놓은 객체

자바스크립트는 코드가 실행 되기 전에 변수 정보들을 미리 수집합니다.
environmentRecord에 저장. (현재 컨텍스트와 관련된 코드의 식별자 정보)

즉 자스는 이미 코드가 실행하기 전에 변수명들을 모두 알게 되는데, 이것을 편의상 최상단에 끌어올린다고 설명한다.

변수 정보를 수집하는 과정, 호이스팅.
호이스팅 과정은 뭐냐면.
environmentRecord의 정보 수집 과정에서. 저장하잖아. 이때 할당에 관해서는 관심이 없고 변수(var x) / 매개 변수(var x = 1) / 함수 선언만 끌어올린다.

그런데 실행 컨텍스트란 실행할 코드에 제공할 환경 정보들을 모아놓은 객체.

자바스크립트가 코드를 실행하면 자바스크립트 엔진은 콜스텍에 전역 실행 컨텍스르를 담는다. 함수가 있다면 그걸 또 담고.
콜스택은 가장 최근에 추가된 실행 컨텍스트만 활성화.

console.log(한국); undefined


var 한국 = "서울"
console.log(한국); //서울

여기가 요약!!
선언 라인 전에도 에러가 나지 않고 변수를 참조할 수 있는 현상을 호이스팅이라고 한다. 선언문이 마치 최상단으로 끌어 올려진듯하다.
이러한 현상이 생기는 이유는 선언문을 물리적으로 끌어올린 것이 아니라 자바스크립트 엔진이 먼저 전체 코드를 쫙 보고 변수 정보를 Record에 미리 기록하기 때문이다.

변수 호이스팅
자바스크립트는 코드를 실행하면, 우선 전역스크립트를 한칸 생성해서 콜스택에 넣는다. 그리고 전체 코드를 보면서 선언할 것이 있는지 체크하고 있다면 선언 해둔다. 이때 record에 기록 하는거지. 그리고 var로 선언 했기 때문에 값은 undefined로 초기화 해둔다. 아래 캡쳐 참고

생성단계: 위에 설명한 것 처럼 스캔 하고 준비하는 단계 실행 컨텍스트를 먼저 생성하고 선언문만 먼저 실행해서 record에 기록해두는 단계.

실행단계: 선언문 외 나머지 코드도 생성.


var는 선언단계에서 메모리 공간을 확보하고 식별자 여기서는 tvChannel을 연결 해두는거임.

반면 let const는 선언만 하게 된다. 초기화(undefind가 없기 때문에)를 안 했기 때문에 유효한 값을 불러올 수 없고 에러 뿜는거임.
선언 라인 전에는 변수를 참조할 수 없다!

함수 호이스팅

console.log(a);
var a = () => {}

함수표현식은 var 변수에 저장할 경우 초기화: undefined는 앞에랑 같은데 type error가 나고 let / const는 초기화 되지 않아서 참조하려고 하니까 reference error남.

반면 함수선언식은 완성된 함수 객체를 생성해서 환경레코드에 기록해둠.
선언과 동시에 함수가 생성된다!!

profile
개발이 싫어.

0개의 댓글