Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

23-1장 실행 컨텍스트 - 나세현 #924

Merged
merged 1 commit into from
Dec 9, 2023
Merged
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
55 changes: 55 additions & 0 deletions docs/23_실행 컨텍스트/나세현.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,55 @@
## 📔 23장: 실행 컨텍스트

실행 컨텍스트는 자바스크립트의 동작 원리를 담고 있는 핵심 개념이다.

### ✨ 23.1: 소스코드의 타입

ECMAScript 사양은 소스코드를 4가지 타입으로 구분하며, 이 소스코드들은 실행 컨텍스트를 생성한다.

| 소스코드의 타입 | 설명 |
| --------------- | --------------------------------------------------------------------------------------------------------- |
| 전역 코드 | 전역에 존재하는 소스코드를 말한다. 전역에 정의된 함수, 클래스 등의 내부 코드는 포함되지 않는다. |
| 함수 코드 | 함수 내부에 존재하는 소스코드를 말한다. 함수 내부에 중첩된 함수, 클래스 등의 내부 코드는 포함되지 않는다. |
| `eval` 코드 | 빌트인 전역 함수인 `eval` 함수에 인수로 전달되어 실행되는 소스코드를 말한다. |
| 모듈 코드 | 모듈 내부에 존재하는 소스코드를 말한다. 모듈 내부의 함수, 클래스 등의 내부 코드는 포함되지 않는다. |

소스코드의 타입에 따라 **실행 컨텍스트를 생성하는 과정과 관리 내용이 다르다**.

#### 1. 전역 코드

전역 코드는 전역 변수를 관리하기 위해 최상위 스코프인 **전역 스코프**를 생성해야 한다.
그리고 `var` 키워드로 선언된 전역 변수와 함수 선언문으로 정의된 전역 함수를 전역 객체의 프로퍼티와 메서드로 바인딩하고 참조하기 위해 전역 객체와 연결되어야 한다.
이를 위해 전역 코드가 평가되면 전역 실행 컨텍스트가 생성된다.

#### 2. 함수 코드

함수 코드는 지역 스코프를 생성하고 지역 변수, 매개변수, `arguments` 객체를 관리해야 한다.
그리고 생성한 지역 스코프를 전역 스코프에서 시작하는 스코프 체인의 일원으로 연결해야 한다.
이를 위해 함수 코드가 평가되면 함수 실행 컨텍스트가 생성된다.

#### 3. `eval` 코드

`eval` 코드는 strict mode에서 자신만의 독자적인 스코프를 생성한다.
이를 위해 `eval` 코드가 평가되면 `eval` 실행 컨텍스트가 생성된다.

#### 4. 모듈 코드

모듈 코드는 모듈별로 독립적인 모듈 스코프를 생성한다.
이를 위해 모듈 코드가 평가되면 모듈 실행 컨텍스트가 생성된다.

### ✨ 23.2: 소스코드의 평가와 실행

자바스크립트 엔진은 소스코드를 **소스코드의 평가**와 **소스코드의 실행**이라는 2개의 과정으로 나누어 처리한다.
소스코드 평가 과정에서는 실행 컨텍스트를 생성하고 변수, 함수 등의 선언문만 먼저 실행해 생성된 변수나 함수의 식별자를 키로 실행 컨텍스트가 관리하는 스코프에 등록한다.
그 후에 비로소 선언문을 제외한 소스코드가 순차적으로 실행된다(= 런타임이 시작된다).
이때 소스코드 실행에 필요한 정보(변수/함수의 참조)는 실행 컨텍스트가 관리하는 스코프에서 검색해서 취득하며, 변수 값의 변경 등 소스코드의 실행 결과는 다시 실행 컨텍스트가 관리하는 스코프에 등록된다.

```javascript
var x;
x = 1;
```

1. 소스코드 평가 과정에서 변수 선언문 `var x;`를 먼저 실행 (이때 생성된 변수 식별자 `x`는 실행 컨텍스트가 관리하는 스코프에 등록되고 `undefined`로 초기화됨)
2. 첫번째 줄은 소스코드 평가 과정에서 이미 실행이 완료되었으므로 `x = 1;`만 실행
3. `x` 변수가 선언된 변수인지 확인 (실행 컨텍스트가 관리하는 스코프에 등록되어 있는지 확인)
4. 등록되어 있다면 값을 할당하고, 할당 결과를 실행 컨텍스트에 등록해 관리
Loading