[코어자바스크립트] 2. 실행컨텍스트

박현정·2021년 11월 28일
1

Javascript

목록 보기
2/4
post-thumbnail

💡 1차로 코어자바스크립트 스터디를 하며 중요한 부분들 정리(21.11.28)

자바스크립트만의 특이한 현상들

어떤 실행컨텍스트가 활성화되는 시점에

  • 선언된 변수를 위로 끌어올리는 동작(호이스팅)
  • 외부 환경 정보를 구성하는 동작
  • this값을 설정하는 동작


실행 컨텍스트란?

실행할 코드에 제공할 환경 정보들을 모아 놓은 객체

  1. 동일한 환경에 있는 코드들을 실행할 때 필요한 환경 정보들을 모아 컨텍스트를 구성(함수를 실행)하고,
  2. 이를 콜 스택(FILO)에 쌓아올렸다가,
  3. 가장 위에 쌓여있는 컨텍스트와 관련 있는 코드들을 실행하는 식

으로 전체 코드의 환경과 순서를 보장한다.



실행 컨텍스트에 담기는 환경정보

  • VariableEnvironment
    • 현재 컨텍스트 내의 식별자들에 대한 정보(environmentRecord)

    • 외부 환경 정보(outer-EnvironmentReference)

      선언 시점의 LexicalEnvironment의 스냅샷으로 변경 사항은 반영되지 않음.
      즉, 최초 실행 시의 스냅샷을 유지


  • LexicalEnvironment
    VariableEnvironment과 담기는 내용은 같지만 변경 사항이 실시간으로 반영됨.

  • ThisBinding
    this 식별자가 바라봐야 할 대상 객체.


LexicalEnvironment

컨텍스트를 구성하는 환경 정보들을 사전에서 접하는 느낌으로 모아놓는다.

  • 현재 컨텍스트 내의 식별자들에 대한 정보(environmentRecord)
  • 외부 환경 정보(outer-EnvironmentReference)

environmentRecord

environmentRecord에는 현재 컨텍스트와 관련된 코드의 식별자 정보들이 저장된다.

  • 매개변수명
  • 변수의 식별자
  • 선언한 함수의 함수명

을 순서대로 수집한다.

코드가 실행되기 전임에도 자바스크립트 엔진은 이미 해당 환경에 속한 코드의 변수명들을 모두 알고 있게 되는 셈이다.
이를 호이스팅(hoisting)이라고 한다.

호이스팅 규칙

  • 변수를 호이스팅할 때 변수명만 끌어올리고 할당 과정은 원래 자리에 그대로 남겨둔다.
  • 함수는 함수 선언과 할당 즉 함수 전체를 끌어올린다.

함수 선언문과 함수 표현식

함수 선언문 : function 정의부만 존재

함수 표현식(익명 함수 표현식) : 정의한 function을 별도의 변수에 할당

  • 차이점 함수 선언문은 함수 전체를 호이스팅하고, 함수 표현식은 변수 선언부만 호이스팅한다

outerEnvironmentReference

스코프 : 식별자에 대한 유효범위이다.

(ES5까지 전역공간을 외하면 오직 함수에 의해서만 스코프가 생성되었다.)

스코프 체인은 스코프를 안에서부터 바깥으로 차례로 검색해나가는 것인데,

이를 가능케 하는 것이 outerEnvironmentReference 이다.

스코프 체인

💡 추가적인 설명 필요

outerEnvironmentReference는 현재 호출된 함수가 선언될 당시의 LexicalEnvironment를 참조한다.

(선언될 당시는 은 콜 스택 상에서 어떤 실행 컨텍스트가 활성화된 상태일 때 뿐이다)

여러 스코프에서 동일한 식별자를 선언한 경우에는 무조건 스코프 체인 상에서 가장 먼저 발견된 식별자에만 접근 가능하다.


this

실행 컨텍스트의 thisBinding에는 this로 지정된 객체가 저장된다.

실행 컨텍스트 활성화 당시에 this가 지정되지 않은 경우 this에는 전역 객체가 저장된다.

(다음 장에서 자세히 설명)




✍2주차 스터디 회고

혼자 가면 빨리 가지만 함께 가면 멀리 간다

프리온보딩을 하면서 같은 팀원들 중에 몇명이 모여 실행 컨텍스트를 주말에 다 같이 한번 공부한 적이 있어서 생각보다 쉬운 파트였다. 사실 그때는 자바스크립트의 ㅈㅂ정도 알때라 너무 모르고 있는 나 자신이 부끄럽고, 이해하기도 어려워서 '참여'라는 자체가 스트레스였어서 엄청 고민하다가 '그냥 해보자! 모른다고 말하는 것도 용기다'는 생각으로 했었다. 사실 같이 공부라기 보단 두 분이서 나를 공부시켜주는 분위기였는데(아직도 감사하다🙏) 설명을 너무 잘해주시고 이해할때까지 알려주시고 보답이라기엔 뭐하지만 그 자리에서 이해하려고 엄청 애썼다. 그땐 스스로 너무 힘들었지만 지금 와서보니 한번 이해를 잘 해두니 이번엔 좀 더 보충, 복습하는 느낌으로 할 수 있었던 것 같다.
취업준비를 하면서 함께하는것의 의미를 몸소 깨닫게 됐다. 만약 내가 부끄러워서 팀원들과 공부를 하지 않았다면, 스터디를 참여하지 않았다면 나는 실행컨텍스트가 이런거구나~까지만 공부하고 넘어가고 다음에 또 이 개념이 나온다면 다시 처음부터 공부 해야했을 것이다.

profile
FE DEVELOPER🐧

0개의 댓글