코어 자바스크립트 02 | 실행 컨텍스트

yuriyaam·2021년 1월 29일
0
post-thumbnail

01. 실행 컨텍스트

  • 스택 : 출입구가 한개. a, b, c, d를 넣으면 꺼내는 순서는 d, c, b, a가 된다.
  • 큐 : 출입구가 양쪽. a, b, c, d를 넣으면 꺼내는 순서도 a, b, c, d가 된다.

실행 컨텍스트란

실행할 코드에 제공할 환경 정보들을 모아놓은 객체이다. 실행 컨텍스트 객체는 활성화되는 시점에 세 가지 정보를 수집한다.

① VariableEnvironment : 초기상태 유지
② LexicalEnvironment : 함수 실행 도중 변경되는 사항이 즉시 반영
③ ThisBinding

02. LexicalEnvironment

  • environmentRecord : 매개변수명, 변수의 식별자, 선언한 함수의 함수명를 수집
  • outerEnvironmentReference : 바로 직전 컨텍스트의 LexicalEnvironment 정보를 참조
    => 바로 직전 컨텍스트란, 콜스택에서 현재 컨텍스트의 아래에 있는 컨텍스트를 말한다.

03. EnvironmentRecord와 호이스팅

자바스크립트 엔진은 식별자들을 최상단으로 끌어올려놓은 다음 실제 코드를 실행하는데, 이를 호이스팅이라고 한다. 참고로, 변수를 호이스팅할 때 변수명만 끌어올리고 할당 과정은 원래 자리에 그대로 남겨둔다. 이 호이스팅된 식별자들은 EnvironmentRecord에 담긴다.

함수 선언의 호이스팅은 중요하다!

함수를 정의하는 방식은 세 가지가 있다.

function a () { ... }         // 함수 선언문. 함수명 a가 곧 변수명

var b = function () { ... }   // 함수 표현식. 변수명 b가 곧 함수명

var c = function d () { ... } // 기명 함수 표현식. 변수명은 c, 함수명은 d

이 중에서 함수 선언문과 함수 표현식을 자세히 보아야 한다.
위에서 호이스팅은 변수명만 끌어올리고 할당 과정은 제자리에 둔다고 했다.
그러나 함수 선언문은 작성된 함수 전체를 호이스팅한다. 이게 왜 위험하냐면, a함수 내용을 변경하면 a함수를 호출하는 모든 곳에 적용되기 때문이다.
반대로 함수 표현식은 변수명만 호이스팅되기 때문에, 함수 내용을 수정 후 호출하면, 수정 이후에 호출한 부분에서만 적용이 된다.


04. Scope

스코프란 변수의 유효범위를 말하는데, 전역변수, 지역변수를 생각하면 이해하기 쉽다.

  • 전역변수 : 전역 컨텍스트의 LexicalEnvironment에 담긴 변수
  • 지역변수 : 그 밖의 함수에 의해 생성된 실행 컨텍스트의 변수들

outerEnvironmentReference는 해당 함수가 선언된 위치의 LexicalEnvironment를 참조한다. 현재 위치의 LexicalEnvironment를 탐색하고, 발견되는 것이 없다면 다음 LexicalEnvironment를 탐색하는 과정을 거친다.
전역 컨텍스트의 LexicalEnvironment까지 탐색해도 해당 변수를 찾지 못하면 undefined를 반환한다.

0개의 댓글