[JavaScript]실행컨텍스트

Goofi·2023년 9월 8일

실행컨텍스트(Execution Context)

코드를 실행할 때 필요한 배경이 되는 조건/환경
실행컨텍스트는 함수를 실행할 때 필요한 환경 정보를 담은 객체이다.

동일환 조건/환경을 지니는 코드 뭉치를 실행할 때 필요한 조건/환경정보

자바스크립트에서는 해당 조건(동일한 조건/환경을 지니는 코드 뭉치)이 4가지가 있다

  • 전역공간 : 자바스크립트 코드가 실행되는 순간에 바로 전역 컨텍스트가 생성되고 전체 코드가 끝날 때에 비로소 전역 컨텍스트가 종료되어 하나의 거대한 함수 공간이라고 봐도 무방한다.
  • 함수
  • eval
  • module : 어딘가에 import 되는 순간에 그 모듈 내부에 있는 컨텍스트가 생성이 되고 그 모듈 코드가 전부 끝났을 때에 컨텍스트가 종료되니까 역시 하나의 함수 공간이라고 해도 무방하다.

결론 : 해당 조건 전부 함수이다.

단) if/for/switch/while...'문'? → 블록스코프
ES6에서 블록스코프 개념이 추가되면서 letconst에 대해서 별개의 독립된 역할을 하고는 있지만 별개의 실행 컨텍스트를 생성하지 않는다.

최종 결론 : 자바스크립트는 오직 함수에 의해서만 컨텍스트를 구분할 수 있다는 점이다.

Call Stack

현재 어떤 함수가 동작중인지 다음에 어떤 함수가 호출될 예정인지 등을 제어하는 자료구조

실행 컨텍스트에는 세 가지 환경 정보들이 담긴다.

  • Variable Environment

    식별자 정보수집
    변화 반영 X
  • Lexical Environment

    각 식별자의 '데이터' 추적
    변화 반영 O
  • ThisBinding

Variable EnvironmentLexical Environment의 차이는 값의 변화가 실시간으로 반영되느냐 그렇지 않느냐의 차이가 있다.

Lexical Environment

실행컨텍스트를 구성하는 환경 정보들을 모아 사전처럼 구성한 객체

예시) 📝실행 컨텍스트 A 환경 사전

  • 내부 식별자 a : 현재 값은 undefined 이다.
  • 내부 식별자 b : 현재 값은 20이다.
  • 외부 정보 : D를 참조한다.

실행컨텍스트는 두 가지 식별자 정보가 있다.

1. environmentRecord

현재 문맥의 식별자 정보가 수집된다.
실행 컨텍스트가 최초 실행 될 때 제일 먼저 하는 일 environmentRecord이다.

✨ 수집과정에서 발생하는 현상을 좀 더 쉽게 생각할 수 있는 다른 방법이 있다.
→ 현재 컨텍스트 식별자 정보를 수집해서 environmentRecord에 담는 과정 이 수집 과정을 호이스팅(식별자 정보를 끌어 올린다)이라고 한다.

호이스팅은 함수 선언문은 전체를 끌어 올린다.

2. outerEnvironmentReference

현재 문맥에 관련 있는 외부 식별자 정보

SCOPE(변수의 유효 범위)

  • SCOPE는 변수의 유효 범위를 말한다.
  • 변수의 유효 범위는 실행 컨텍스트가 만드는 것이다.
  • SCOPE는 외부로는 나갈 수는 있는데 안쪽으로는 들어 갈 수 없다.


inner 함수에서 선언한 변수는 outer 함수에서 접근할 수 없다.
왜냐하면 outer 함수에는 inner 함수의 LexicalEnvironment에 대한 접근할 수 있는 수단이 없다.(참조하고 있는 대상이 없다.)
inner 컨텍스트에서 선언한 변수는 environmentRecord에 의해서 접근할 수 있다. outerEnvironmentReference를 통해서 outer함수의 LexicalEnvironment 정보에도 접근할 수 있다.

SCOPE CHAIN

❗️위 사진 참고

1. inner 함수에서 "어떤 변수를 찾아라"라고 명령
2. 일단 environmentRecord에서 해당 변수가 있는지 찾는다.
3. 만약 inner에 없다면 outerEnvironment Reference를 타고 outer함수 environmentRecord에서 변수를 찾는다.
4. outer에도 해당 변수가 없다면 outerEnvironmentReference를 타고 전역 컨텍스트에가서 전역컨텍스트에 environmentRecord에서 해당 변수를 찾는다.

이러한 과정이 SCOPE CHAIN이다.

inner함수에서 a를 찾는다
하지만 inner함수에는 a가 없다. 그리고 outer함수에 a=2 전역컨텍스트에는 a=3있다 그래서 inner함수는 outerEnvironmentReference로 먼저 outer함수가 있기 때문에 a=2가 되게 된다.

정리

가장 가까운 자기 자신부터 점점 멀리 있는 스코프로 찾아 나가는 것
즉 가장 가까운 곳에서 가장 먼저 찾아지는 것만 접근 - shadowing 개념

profile
안녕하세요! 👋 개발과 운영을 공부하고 있습니다. 코드를 작성하는 것만큼 서비스가 안정적으로 운영되는 것에도 관심이 많습니다. 프론트엔드부터 백엔드, 그리고 인프라 운영까지 전체적인 서비스 생명주기를 이해하면서 공부하고 있습니다.

0개의 댓글