일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
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 |
- 자바스크립트 문제
- 제로베이스
- 프로그래머스
- Next
- JavaScript
- 알고리즘문제풀이
- 자바스크립트 알고리즘
- HTML
- 자바스크립트코딩테스트
- 자바스크립트 문제 풀이
- 리액트
- Baekjoon
- stack문제
- 자바스크립트 연결리스트
- next13
- NPM
- 자바스크립트
- 프론트엔드
- lodash
- JS
- CSS
- Next.js13
- 타입스크립트
- 자바스크립트 알고리즘 문제
- til
- leetcode문제풀이
- leetcode
- 자바스크립트 문제풀이
- 리액트쿼리
- react
- Today
- Total
코드노트
자바스크립트 실행 컨텍스트 Execution context 정리 본문
실행 컨텍스트 Execution context
- 자바스크립트 동작 원리를 담고 있는 개념
실행 컨텍스트를 이해해야하는 이유
- 자바스크립트가 스코프를 기반으로 식별자와 식별자에 바인당된 값을 관리하는 방식
- 호이스팅이 발생
- 클로저의 동작 방식
- 테스트 큐와 함께 동작하는 이벤트 핸들러
- 비동기 처리의 동장 방식
실행 컨텍스트 구성
- 전역공간은 자동으로 컨텍스트로 구성
- 함수를 실행
- eval()함수를 실행
- block을 만든다.
소스코드 타입
소스코드 타입 | 설명 |
전역 코드 global coad | 전역에 존재하는 소스코드, 전역에 정의된 함수, 클래스 등의 내부 코드는 포함되지 않음 |
함수 코드 function code | 함수 내부에 존재하는 소스코드. 함수 내부에 중첩된 함수, 클래스 등의 내부 코드는 포함되지 않음. |
eval 코드 eval coad | 빌트인 전역 함수인 eval 함수에 인수로 전달되어 실행되는 소스코드 |
모듈 코드 module coad | 모듈 내부에 존재하는 소스코드. 모듈 내부의 함수, 클래스 등의 내부 코드는 포함되지 않음 |
- 소스코드 타입에 따라 실행 컨텐스트를 생성하는 과정 및 관리 내용이 달라진다.
전역 코드
- 전역 변수를 관리하기 위해 최상위 스코프인 전역 스코프를 생성
- 전역 코드가 평가되면 전역 실행 컨텍스트가 생성
함수 코드
- 함수 코드는 지역 스코프를 생성하고 지역 변수, 매개변수, aguments객체를 관리
- 생성한 지역 스코프를 전역 스코프에서 시작하는 스코프 체인의 일원으로 연결
- 함수 코드가 평가 되면 함수 실행 컨텐스트가 생성
eval 코드
- strict mode(엄격 모드)에서 자신만의 독자적인 스코프를 생성
- eval 코드가 평가되면 eval 실행 컨텍스트가 생성
모듈 코드
- 모듈별로 독립적인 모듈 스코프를 생성
- 모듈 코드가 평가되면 모듈 실행 컨텍스트가 생성
소스코드의 평가와 실행
- 모든 소스코드는 실행에 앞서 평가 과정을 거치며 코드를 실행하기 위한 준비를 한다.
- JS엔진은 소스코드의 평가, 소스코드의 실행 과정을 나누어 처리
소스코드 평가 과정
1. 실행 컨텍스트를 생성
2. 변수, 함수 등 선언문만 먼저 실행하여 생성된 변수나 함수 식별자를 키로 실행 컨텍스트가 관리하는 스코프에 등록
3. 소스평가 과정이 끝나면 런타임이 시작 ( 선언문을 제외한 소스코드가 순차적으로 실행 )
* 소스코드 실행에 필한 정보, 변수나 함수 참조를 실행 컨텍스트가 관리하는 스코프에서 검색하고 취득
4. 변수 값의 변경 등 소스코드의 실행 결과는 다시 실행 컨텍스트가 관리하는 스코프에 등록
평가 및 실행 순서 확인 예제
const x = 1; // 1
const y = 2; // 2
function foo(a) {
const x = 10; // 4
const y = 20; // 5
console.log(a + x + y); // 6
}
foo(100); // 3
console.log(x + y); // 7
순서대로 번호를 매겨보았다.
- 1, 2 전역 변수를 선언
- 3 함수 호출
- 4, 5 함수 내 지역 변수 선언
- 6 메서드 호출
- 7 메서드 호출
위 순서대로 실행되니 참고하자.
* 실행컨텍스트를 이용하면 디버깅 또한 쉬워진다!
- 코드가 실행되려면 스코프, 식별자 코드 실행 순서 등의 관리가 필요
▶ 선언에 의해 생성된 모든 식별자(변수, 함수, 클래스 등)의 스코프를 구분하여 등록하고 상태변화를 지속적으로 관리
▶ 스코프는 중첩 관계에 의해 스코프 체인을 형성 (스코프 체인을 통해 상위 스코프로 이동하며 식별자를 검색)
▶ 현재 실행중인 코드의 실행 순서를 변경할 수 있어야하며, 다시 되돌아갈 수 있어야 한다.
* 실행 컨텍스트는 소스코드를 실행하는데 필요한 환경을 제공하고 코드의 실행 결과를 실제로 관리하는 영역
* 식별자를 등록하고 관리하는 스코프와 코드 실행 순서관리를 구현한 내부 메커니즘으로,
모든 코드는 실행 컨텍스트를 통해 실행되고 관리된다.
- 코드 실행 순서는 실행 컨텍스트 스택으로 관리
- 식별자와 스코프는 실행 컨텍스트의 렉시컬 환경으로 관리
실행 컨텍스트 스택은 코드의 실행 순서를 관리
- 소스코드가 평가되면 실행 컨텍스트가 생성
- 실행 컨텍스트 스택의 최상위에 쌓인다.
- 실행 컨텍스트 스택의 최상위에 존재하는 실행 컨텍스트는 언제나 현재 실행중인 코드의 실행 컨텍스트
- 더 이상 실행할 컨텍스트가 없으면 pop을 통해 스택에서 없어진다.
렉시컬 환경
* 스코프를 구분하여 식별자를 등록하고 관리하는 저장소 역할을 하는 렉시컬 스코프
- 렉시컬 환경은 식별자와 식별자에 바인딩된 값, 상위 스코프에 대한 참조를 기록하는 자료구조로 실행 컨텍스트를 구성하는 컴포넌트
- 스코프와 식별자를 관리
- 키와 값을 갖는 객체 형태의 스코프를 생성 ( 식별자를 키로 등록, 식별자에 바인딩된 값을 관리 )
◆ 환경 레코드
- 스코프에 포함된 식별자를 등록하고 등록된 식별자에 바인딩된 값을 관리하는 저장소
- 소스코드 타입에 따라서 관리하는 내용에 차이가 있다.
◆ 외부 렉시컬 환경에 대한 참조
- 상위 스코프를 가리킴 ( 상위 스코프 : 외부 렉시컬 환경, 해당 실행 컨텍스트를 생성한 소스코드를 포함하는 상위 코드의 렉시컬 환경 )
- 외부 렉시컬 환경에 대한 참조를 통해 단방향 링크드 리스트인 스코프 체인을 구현
- 렉시컬 환경을 누군가 참조하고 있다면 렉시컬 환경은 소멸하지 않는다.
블록 레벨 스코프
- let, const는 선언전 환경 레코드를 갖는 렉시컬 환경을 새롭게 생성하여 기존의 전역 레시컬 환경을 교체
- 만약 for 문의 코드 블록 내에서 정의된 함수가 있다면 이 함수의 상위 스코프는 코드 블록이 생성한 렉시컬 환경
'Code note > 자바스크립트' 카테고리의 다른 글
스크롤 상단 고정 네비게이션 (0) | 2022.12.31 |
---|---|
자바스크립트 클래스 정리 (0) | 2022.12.24 |
자바스크립트 this 이해하기 (1) | 2022.12.21 |
프로토타입 기반의 객체지향 언어, 자바스크립트 프로토타입 이해 (0) | 2022.12.19 |
자바스크립트 함수 객체 프로퍼티 정리 (0) | 2022.12.15 |