diff --git "a/docs/23_\354\213\244\355\226\211 \354\273\250\355\205\215\354\212\244\355\212\270/\352\271\200\353\213\244\354\235\200.md" "b/docs/23_\354\213\244\355\226\211 \354\273\250\355\205\215\354\212\244\355\212\270/\352\271\200\353\213\244\354\235\200.md" new file mode 100644 index 00000000..9e96a8aa --- /dev/null +++ "b/docs/23_\354\213\244\355\226\211 \354\273\250\355\205\215\354\212\244\355\212\270/\352\271\200\353\213\244\354\235\200.md" @@ -0,0 +1,47 @@ +# 23장 실행 컨텍스트 + +> 실행 컨텍스트란 자바스크립트의 동작 원리를 담고 있는 핵심 개념으로, 식별자, 식별자 바인딩 관리 방식, 호이스팅이 발생하는 이유, 클로저의 동작 방식, 이벤트 핸들러와 비동기 처리의 동작 방식 모두 실행 컨텍스트와 관련있다. + +## 1. 소스코드의 타입 + +ECMAScript 사양은 소스코드를 4가지 타입으로 구분한다. + +- 전역 코드 + + 전역 코드가 평가되면 전역 실행 컨텍스트가 생성된다. + +- 함수 코드 + +함수 코드가 평가되면 함수 실행 컨텍스트가 생성된다. + +- eval 코드 + +빌트인 전역 함수인 eval 함수에 인수로 전달되어 실행되는 소스코드. + +- 모듈 코드 + +모듈 내부에 존재하는 소스코드. 모듈 내부의 함수, 클래스 등의 내부 코드는 포함되지 않는다. + +| 타입 | 설명 | 관리 내용 | 코드 평가 결과 | +| --------- | ----------------------------------------------------------------------------------------- | ----------------------------------------------------------------------------------------------------------------- | ------------------ | +| 전역 코드 | 전역에 존재하는 소스코드. 전역에 정의된 함수, 클래스 등의 내부 코드는 포함되지 않는다. | 전역 스코프(최상위 스코프) 생성, 전역 변수와 전역 함수를 전역 객체의 프로퍼티와 메서드로 바인딩, 전역 객체와 연결 | 전역 실행 컨텍스트 | +| 함수 코드 | 함수 내부에 존재하는 소스코드. 중첩 함수와 클래스 등의 내부 코드는 포함되지 않는다. | 지역 스코프 생성, 지역 변수, 매개변수, arguments 객체 관리, 지역 스코프를 전역 스코프와 스코프 체인으로 연결 | 함수 실행 컨텍스트 | +| eval 코드 | 빌트인 전역 함수인 eval 함수에 인수로 전달되어 실행되는 소스코드 | strict mode에서 독자적인 스코프를 생성 | eval 실행 컨텍스트 | +| 모듈 코드 | 모듈 내부에 존재하는 소스코드. 모듈 내부의 함수, 클래스 등의 내부 코드는 포함되지 않는다. | 모듈별로 독립적인 모듈 스코프를 생성 | 모듈 실행 컨텍스트 | + +
+ +## 2. 소스코드의 평가와 실행 + +**모든 소스코드는 자바스크립트 엔진에 의해 "소스코드의 평가"와 "소스코드의 실행" 과정으로 나누어 처리된다**. + +### 소스코드 평가 + +- 실행 컨텍스트 생성 +- 변수, 함수 등의 선언문만 먼저 실행하여 생성된 식별자 키로 실행 컨텍스트가 관리하는 스코프에 등록 + +### 소스코드 실행 + +- 평가 과정이 끝나면 순차적으로 실행(런타임) +- 소스코드 실행에 필요한 변수나 함수의 참조 정보는 실행 컨텍스트가 관리하는 스코프에서 검색하여 취득 +- 소스코드의 실행 결과(변수 값 변경 등)는 다시 실행 컨텍스트가 관리하는 스코프에 등록