Jake Seo
제이크서 개발 블로그
Jake Seo
전체 방문자
오늘
어제
  • 분류 전체보기 (719)
    • AI 서비스 개발 일기 (3)
    • LLM 개발 일기 (1)
    • ------레거시 (2025.08.23 이전)--.. (0)
    • 백준 문제풀이 (1)
    • 릿코드 문제풀이 (2)
    • 알고리즘 이론 (10)
      • 기본 이론 (2)
      • 배열과 문자열 (8)
    • 데이터베이스 (15)
      • Planet Scale (1)
      • MSSQL (9)
      • 디비 기본 개념 (1)
      • SQLite 직접 만들어보기 (4)
    • 보안 (7)
    • 설계 (1)
    • 네트워크 (17)
      • HTTP (9)
      • OSI Layers (5)
    • 회고 (31)
      • 연간 회고 (2)
      • 주간 회고 (29)
    • 인프라 (52)
      • 도커 (12)
      • AWS (9)
      • 용어 (21)
      • 웹 성능 (1)
      • 대규모 서비스를 지탱하는 기술 (9)
    • 깃 (7)
    • 빌드 도구 (7)
      • 메이븐 (6)
      • 그레이들 (0)
    • Java (135)
      • 이펙티브 자바 (73)
      • 자바 API (4)
      • 자바 잡지식 (30)
      • 자바 디자인 패턴 (21)
      • 톰캣 (Tomcat) (7)
    • 프레임워크 (64)
      • next.js (14)
      • 스프링 프레임워크 (28)
      • 토비의 스프링 (6)
      • 스프링 부트 (3)
      • JPA (Java Persistence API) (5)
      • Nest.js (8)
    • 프론트엔드 (48)
      • 다크모드 (1)
      • 노드 패키지 관리 매니저 (3)
      • CSS (19)
      • Web API (11)
      • tailwind-css (1)
      • React (5)
      • React 새 공식문서 요약 (1)
      • HTML (Markup Language) (5)
    • 자바스크립트 (108)
      • 모던 자바스크립트 (31)
      • 개념 (31)
      • 정규표현식 (5)
      • 코드 스니펫 (1)
      • 라이브러리 (6)
      • 인터뷰 (24)
      • 웹개발자를 위한 자바스크립트의 모든 것 (6)
      • 팁 (2)
    • Typescript (49)
    • 리눅스와 유닉스 (10)
    • Computer Science (1)
      • Compiler (1)
    • IDE (3)
      • VSCODE (1)
      • IntelliJ (2)
    • 세미나 & 컨퍼런스 (1)
    • 용어 (개발용어) (16)
      • 함수형 프로그래밍 용어들 (1)
    • ORM (2)
      • Prisma (2)
    • NODEJS (2)
    • cypress (1)
    • 리액트 네이티브 (React Native) (31)
    • 러스트 (Rust) (15)
    • 코틀린 (Kotlin) (4)
      • 자바에서 코틀린으로 (4)
    • 정규표현식 (3)
    • 구글 애널리틱스 (GA) (1)
    • SEO (2)
    • UML (2)
    • 맛탐험 (2)
    • 리팩토링 (1)
    • 서평 (2)
    • 소프트웨어 공학 (18)
      • 테스팅 (16)
      • 개발 프로세스 (1)
    • 교육학 (1)
    • 삶의 지혜, 통찰 (1)
    • Chat GPT (2)
    • 쉘스크립트 (1)
    • 컴파일 (2)
    • Dart (12)
    • 코드팩토리의 플러터 프로그래밍 (4)
    • 플러터 (17)
    • 안드로이드 스튜디오 (1)
    • 윈도우즈 (1)
    • 잡다한 백엔드 지식 (1)
    • 디자인 패턴 (1)

블로그 메뉴

  • 홈
  • 태그
  • 방명록

공지사항

인기 글

태그

  • item8
  • Pre-rendering
  • 알고리즘
  • 자바스크립트
  • prerendering
  • 팩터리 메서드 패턴
  • serverless computing
  • item9
  • 자바스크립트 인터뷰
  • rust
  • 객체복사
  • 도커공식문서
  • 자바 디자인패턴
  • Java
  • 프로그래머의 뇌
  • 이펙티브 자바 item9
  • 외래키 제약조건
  • 메이븐 골
  • Javadoc 자바독 자바주석 주석 Comment
  • Next.js
  • 이펙티브 자바
  • 작업기억공간
  • 자바스크립트 면접
  • 러스트
  • next js app
  • NEXT JS
  • 슬로우 쿼리
  • 느린 쿼리
  • 추상 팩터리 패턴
  • 자료구조
  • 자바
  • MSSQL
  • 메이븐 라이프사이클
  • 디자인패턴
  • 스프링 검증
  • 참조 해제
  • try-with-resources
  • 서버리스 컴퓨팅
  • item7
  • 플라이웨이트패턴
  • pnpm
  • 자바 검증
  • 메이븐 페이즈
  • 토비의 스프링
  • 빈 검증
  • 싱글톤
  • 싱글톤 패턴
  • 이펙티브자바
  • bean Validation
  • 싱글턴

최근 댓글

최근 글

티스토리

hELLO · Designed By 정상우.
Jake Seo

제이크서 개발 블로그

자바스크립트/개념

자바스크립트의 실행 컨텍스트 (Execution Context) 란?

2023. 2. 5. 19:43

실행 컨텍스트란?

  • 함수 실행 내에서 환경을 가리키는 추상적인 개념이다.
  • 실행할 코드에 제공할 환경 정보들을 모아놓은 객체이다.

실행 컨텍스트의 생성 시점

  • 실행 컨텍스트는 일반적으로 매 함수 호출 시에 생성된다.
  • 함수 호출만큼 자주 일어나진 않지만, 함수 호출 외에도 전역 공간, eval() 함수 실행에도 실행 컨텍스트가 구성된다.

화살표 함수의 실행 컨텍스트

  • 화살표 함수도 일반 함수처럼 실행 컨텍스트가 생긴다.
  • 단, 화살표 함수의 this 는 lexically scoped 된다.
    • 그래서 화살표 함수는 어떻게 호출되냐보다 어떤 블럭에서 정의되었냐가 중요하다.

실행 컨텍스트가 하는 일

  • 호이스팅을 수행한다.
  • this 의 값을 결정한다.
  • 현재의 스코프에서 어떤 변수에 접근할 수 있는지를 결정한다.
  • 인자(arguments)를 관리한다.
  • 변수의 생성과 메모리의 할당에도 관여한다.

실행 컨텍스트와 콜스택

  • 매 함수 호출시 생성되는 실행 컨텍스트는 스택 구조로 콜스택에 쌓이게 된다.
function outerFunction() {
  function innerFunction() {
    console.log("inner function");
  }

  console.log("outer function");
}

outerFunction();
  • 위의 예제 코드를 실행하면 콜 스택에는 다음과 같은 순서로 컨텍스트가 쌓인다.
    • 전역 컨텍스트 -> outerFunction -> innerFunction
  • 스택 구조의 특성을 그대로 받아 다음의 순서로 콜스택에서 제거된다.
    • innerFunction -> outerFunction -> 전역 컨텍스트
  • 콜 스택의 맨 위에 있는 컨텍스트가 현재 실행 중인 컨텍스트이다.
  • 실행 컨텍스트 활성화 시에 엔진은 환경 정보를 실행 컨텍스트 객체에 저장한다.

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

  • 실행 컨텍스트는 개발자가 코드로 확인할 수는 없지만 몇가지 정보가 담긴다.

Variable Environment

  • 자바스크립트 엔진이 변수 참조를 참조하거나 변수의 스코프를 결정하는데 사용된다.
  • 컨텍스트 내의 식별자 정보를 가지고 있다.
  • 외부 환경 정보를 가지고 있다.
    • Outer Environment Reference (snapshot)
      • 바로 직전 컨텍스트의 Lexical Environment
  • 선언 시점의 Lexical Environment 의 스냅샷을 가지고 있다. (스냅샷이므로 변경사항이 반영되지 않는다.)
    • Environment Record (snapshot)
      • Declarative Environment Records: 매개변수명, 변수의 식별자, 선언한 함수의 함수명
      • Object Environment records: 객체 내부의 환경 레코드

Lexical Environment

  • 자료구조로 함수나 코드 블럭의 정적인 스코핑을 나타낸다.
  • 처음엔 Variable Environment 와 같은 정보를 가지고 있다.
    • 처음에는 Variable Environment 와 같지만, 변경 사항이 실시간으로 반영된다.
    • ex) while 이나 for 같은 블록 구문을 사용하는 순간 변경된다.

This Binding

  • 이름처럼 this 식별자가 바라봐야 할 대상 객체가 들어있다.

코드로 살펴보기

function do_something() {
  var a = 1;
  let b = 2;
  while (true) {
    var c = 3;
    let d = 4;
    console.log(b);
    break;
  }
}

do_something();
  • do_something() 을 실행한 순간 실행 컨텍스트는 아래처럼 구성된다.
ExecutionContext:
    LexicalEnvironment:
        b -> nothing
        outer: VariableEnvironment // here should VariableEnvironment
    VariableEnvironment:
        a -> undefined, c -> undefined
        outer: global
    ...
  • 아직 내부 블럭이 해석되지 않아 LexicalEnvironment 는 변수 d 와 같은 정보를 가지고 있지 않다.
    • 다만 c 는 var 로 선언되어 이미 호이스팅되어 있다.
  • while(true) 에 들어가는 순간 실행 컨텍스트는 아래처럼 변한다.
ExecutionContext:
    LexicalEnvironment:
        d -> nothing
        outer:
            LexicalEnvironment
                b -> 2
                outer: global
    VariableEnvironment:
        a -> 1, c -> undefined
        outer: global
    ...
  • while 블록 내부로 들어와 d 에 대한 정보를 환경에 넣었다.

실행 컨텍스트의 메인 컴포넌트

  • 실행 컨텍스트는 두가지 메인 컴포넌트로 이루어져 있다.

Variable Object (VO)

  • 위에서 언급했던 Variable Environment 내부에 Environment Record 에 존재하는 한 컴포넌트이다.
  • Variable Object 는 자료구조로 컨텍스트 내부에서 선언된 모든 변수, 함수, 인자들의 집합을 가지고 있다.
  • 전역 컨텍스트에서 Variable Object 는 window (브라우저의 경우) 와 같은 전역 객체 그 자체이다.
    • 실행 컨텍스트에 따라 가리키는 객체가 달라지게 된다.
    • 전역 코드와 함수 코드의 구성 요소가 다르기 때문이다.
      • 함수 코드에는 인자가 있지만, 전역 코드엔 없다.

Scope Chain

  • 스코프 체인은 객체의 링크드 리스트로 현재 컨텍스트의 VO 에서 시작하여, 외부 컨텍스트의 VO, 글로벌 컨텍스트까지 이어진다.
  • 엔진은 스코프 체인을 통해 렉시컬 스코프를 파악한다.
  • Variable Lookup 에 활용된다.
    • 검색에 실패하는 경우 Reference Error 가 발생한다.

[[Scopes]] 프로퍼티

  • 함수는 내부에 [[Scopes]] 라는 프로퍼티를 가지고 있다.
    • 자바스크립트 코드에서는 직접 접근할 수 없다.
  • 함수의 생성 시점에 생겨난다.
  • Lexical Environment 로의 참조를 가지고 있다.
  • Environment Records 의 배열이다.
    • [Lexical Environment, 외부함수의 실행 환경, 전역 객체] 등을 갖고 있다.
  • 함수 내부에서 어떤 변수를 이용할 때 이 프로퍼티를 이용하여 해석한다.
    • 스코프 체인처럼 차례차례 Environment Records 의 배열을 뒤져본다.
  • 외부 함수의 실행 컨텍스트가 소멸하여도 [[Scopes]] 는 여전히 외부 함수의 실행 환경을 참조할 수 있다.
    • 이를 클로저 (Closure) 라고 한다.

레퍼런스

https://stackoverflow.com/questions/23948198/variable-environment-vs-lexical-environment

저작자표시 비영리 (새창열림)

'자바스크립트 > 개념' 카테고리의 다른 글

script 태그의 defer 키워드와 async 키워드 쉽게 알아보기  (0) 2023.02.20
매크로 태스크 (Macro Task) 와 마이크로 태스크 (Micro Task) 란?  (0) 2023.02.13
Lexical Scope (렉시컬 스코프) 란? (자바스크립트의 스코핑 방식)  (0) 2023.02.02
이터러블 스프레드 문법이란?  (0) 2023.01.31
전개 구문, 속성 스프레드 구문 (Spread Syntax) 이란?  (0) 2023.01.02
    '자바스크립트/개념' 카테고리의 다른 글
    • script 태그의 defer 키워드와 async 키워드 쉽게 알아보기
    • 매크로 태스크 (Macro Task) 와 마이크로 태스크 (Micro Task) 란?
    • Lexical Scope (렉시컬 스코프) 란? (자바스크립트의 스코핑 방식)
    • 이터러블 스프레드 문법이란?
    Jake Seo
    Jake Seo
    ✔ 댓글로 틀린 부분을 지적해주시면 기분 나빠하지 않고 수정합니다. ✔ 많은 퇴고를 거친 글이 좋은 글이 된다고 생각합니다. ✔ 간결하고 명료하게 사람들을 이해 시키는 것을 목표로 합니다.

    티스토리툴바