| 일 | 월 | 화 | 수 | 목 | 금 | 토 |
|---|---|---|---|---|---|---|
| 1 | 2 | 3 | 4 | |||
| 5 | 6 | 7 | 8 | 9 | 10 | 11 |
| 12 | 13 | 14 | 15 | 16 | 17 | 18 |
| 19 | 20 | 21 | 22 | 23 | 24 | 25 |
| 26 | 27 | 28 | 29 | 30 | 31 |
- c++개요
- 신한해커톤
- 해커톤
- 도커
- SESSION
- 신한금융희망재단
- 도커컨테이너
- 쉽게 배우는 자바 프로그래밍
- 컨테이너
- 클라우드컴퓨팅
- On-demand
- Stateless
- 용어정리
- iaas
- PaaS
- SaaS
- 도커이미지
- 네트워크
- CSV란?
- stateful
- c++역사
- 1장
- 도커개념정리
- c언어c++차이
- it
- 신한스퀘어브릿지해커톤
- payasyougo
- Cookie
- 명품C++
- docker
- Today
- Total
수리 공작소
스코프와 실행 컨텍스트 용어 및 개념 정리 - 1 본문
「 스코프? 」
스코프란 변수가 유효하게 접근할 수 있는 범위.
각 스코프는 그 내부에서만 접근이 가능한 변수들의 집합을 가지고 있다.
그럼 어딘가 기록이 되어있어야 한다. 그걸 가지고 있는 것이 바로 실행 컨텍스트이다.
「 실행 컨텍스트 」
지금 스코프에서 접근할 수 있는 변수, 함수(원시값, 객체)에 대한 정보와, this는 어떤 것을 가리키는지 등등 실행에 필요한 모든 정보를 담고 있는 객체이다.
「 누가 실행 컨텍스트를 가질까? 」
스코프에 대한 변수 정보이므로 스코프의 종류를 생각해보면 된다.
전역, 함수, 블록 중에 블록은 그 정도의 정보를 저장할 필요가 없기 때문에 실행 컨텍스트를 가지지 않는다.
따라서
- 함수 실행 컨텍스트
- 전영 실행 컨텍스트
eval 실행 컨텍스트
가 존재한다. eval 실행 컨텍스트는 eval()이라는 함수가 실행될 때 만들어지는 것이다. eval() 함수는 문자열을 코드로 바꿔 실행해주는 함수라고 한다. 하지만 해당 함수는 보안상의 이유로 거의 사용하지 않아 의미가 없어져 설명에서 제외한다.

이번 글에서는 아래의 내용을 다룰 것이다.
1. 각 실행 컨텍스트의 생성과 실행 시점
2. 실행 컨텍스트의 구성요소
「 각 실행 컨텍스트의 생성과 실행 시점 」
생성이 되는 Creation Phase와 코드를 실행하는 Execution Phase로 보통 나눠서 설명한다.
Creation Phase에서 주의할 점이 하나 있는데, 변수의 경우에는 호이스팅이 되고 선언문에서 변수가 등록만 되고 할당은 undefined 형태이다. 하지만 함수의 경우에는 객체 자체가 function Object로 할당이 된다. 해당 부분은 다른 글에서 다루려고 한다!
1. Global execution context (전역 실행 컨텍스트)
전역 실행 컨텍스트는 생성이 프로그램 실행 최초에 1번 일어나고, 곧 바로 ECS (execution context stack, 흔히 콜스택)에 올라가 실행이 된다.
Creation Phase
- Global Object를 생성
- this Object를 생성하고 global Object에 바인드
- 변수와 함수 참조를 담을 수 있는 힙 메모리는 준비
- 전역 변수/함수 선언 hoisting(undefined 초기화)
Execution Phase
- 실행문 한 줄씩 실행
- 함수를 만나면 함수 실행 컨텍스트 생성 및 실행
2. Function execution context
1) creation phase
모든 함수 정의의 순간에 creation phase 발생.
이때 함수에 대한 여러 정보를 담은 function Object를 힙에 생성.
2) execution phase
함수 호출의 순간에 execution phase 발생.
함수 실행 컨텍스트 자체는 이때 생성이 됨.
함수에 대한 정보를 얻기 위해 function Object를 참조하고 있다.
(function Object에 어떤 슬롯이 어떻게 참조되는지는 다음 글에..!)
실행 컨텍스트의 구성 요소
먼저 종류에 관계 없이 실행 컨텍스트가 가질 수 있는 구성 요소이다.
ExecutionContext = {
[[LexicalEnvironment]],
[[VariableEnvironment]],
[[ThisBinding]],
[[Realm]],
[[Function]],
[[ScriptOrModule]]
}
environment와 environment record에 대한 개념
두 가지는 레벨이 다르다.
environment는 스코프와 비슷하게 생각하면 된다.
environment record는 해당 스코프 내부에 어떤 변수들이 있는지 저장되어 있는 곳이다.
즉, environment안에 environment record가 포함되어있다.
environment record의 종류
1. Declarative Environment Record
let, const, var, 함수 선언 등 코드로 선언된 식별자들을 내부 슬롯에 저장하는 기본 스코프 저장소.
2. Function Environment Record
함수 호출 시 생성되며 매개변수, arguments, this, 내부 변수 등을 저장하는 함수 전용 스코프 레코드.
3. Module Environment Record
ES Module 실행 시 만들어지며 모듈의 top-level 변수 + import/export 바인딩을 저장하는 스코프 레코드.
4. Object Environment Record
with(obj) 문에서 사용되며 객체의 프로퍼티를 변수처럼 참조하도록 만드는 특수 스코프 레코드.
5. Global Environment Record
전역 실행 시 사용되며 전역 객체(=ObjectER) + 전역 let/const(=DeclarativeER)를 함께 관리하는 복합 전역 스코프 레코드.
여기서 실행 컨텍스트를 공부 중인 우리가 기억할 것은 1, 2, 5번이다.
그럼 전역, 함수 실행 컨텍스트에서는 어떤 레코드들이 어떻게 사용될까?
Global Execution Context
├── LexicalEnvironment
│ ├── [[EnvironmentRecord]] = GlobalEnvironmentRecord (GER)
│ └── [[OuterEnv]] = null
│
├── VariableEnvironment
│ ├── [[EnvironmentRecord]] = GlobalEnvironmentRecord (GER)
│ └── [[OuterEnv]] = null
│
└── ThisBinding = global object (window / globalThis)
Function Execution Context
├── LexicalEnvironment
│ ├── [[EnvironmentRecord]] = FunctionEnvironmentRecord(FER)
│ └── [[OuterEnv]] = 함수가 정의될 때 캡처한 LexicalEnv
└── VariableEnvironment
├── [[EnvironmentRecord]] = DeclarativeEnvironmentRecord (var 저장소)
└── [[OuterEnv]] = 함수 생성 시 LexicalEnv(같은 부모)
Q. Realm이.... 각 실행 컨텍스트마다 있다구요? 전역에 하나만 존재한다는 곳도 있고..