일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
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 |
- react
- frontend
- Queue
- 블록체인
- blockchain
- BOJ
- Python
- 딥다이브
- Execution context
- 클로저
- let
- Javascript
- var
- Algorithm
- 정렬
- nft
- 파이썬
- 변수
- 실행 컨텍스트
- 프로퍼티
- solidity
- 솔리디티
- 알고리즘
- git pull
- 리액트
- 백준
- 자바스크립트
- Deep Dive
- Interview
- 함수
- Today
- Total
공부하자
[Javascript] 실행 컨텍스트, 렉시컬 환경, 클로저 본문
실행 컨텍스트와 렉시컬 환경, 클로저는 자바스크립트에서 워낙 중요한 개념들이고 다 연관이 있어서 면접 준비를 하면서 한번에 정리를 해보았습니다. 제가 이해하기 쉽게 큰 개념정도만 간략하게 정리한거라 혹시 틀린것이 있으면 댓글로 알려주세요!!😊
모든 소스코드는 실행에 앞서 평가 과정을 거치며 코드를 실행하기 위한 준비를 한다.
평가 과정에서는 실행 컨텍스트를 생성하고 변수, 함수 등의 선언문만 먼저 실행하여 생성된 변수나 함수 식별자를 키로 실행 컨텍스트가 관리하는 스코프(렉시컬 환경의 환경 레코드)에 등록된다.
평가 과정이 끝나면 선언문을 제외한 소스코드가 순차적으로 실행되기 시작한다.(런타임) 이때 소스코드 실행에 필요한 정보, 즉 변수나 함수의 참조를 실행 컨텍스트가 관리하는 스코프에서 검색하여 취득한다. 그리고 변수 값의 변경 등 소스코드의 실행 결과는 다시 실행 컨텍스트가 관리하는 스코프에 등록된다.
실행 컨텍스트
실행 컨텍스트는 소스코드를 실행하는 데 필요한 환경을 제공하고 코드의 실행 결과를 실제로 관리하는 영역이다.
자세하게는 다음과 같은 것들을 관리한다.
- 선언에 의해 생성된 모든 식별자(변수, 함수, 클래스 등)를 스코프를 구분하여 등록하고 상태 변화(식별자에 바인딩된 값의 변화)를 지속적으로 관리할 수 있어야 한다.
- 스코프는 중첩 관계에 의해 스코프 체인을 형성해야 한다. 즉, 스코프 체인을 통해 상위 스코프로 이동하며 식별자를 검색할 수 있어야 한다.
- 현재 실행 중인 코드의 실행 순서를 변경(예를 들어, 함수 호출에 의한 실행 순서 변경)할 수 있어야 하며 다시 되돌아갈 수도 있어야 한다.
좀 더 구체적으로 말해, 실행 컨텍스트는 식별자(변수, 함수, 클래스 등의 이름)을 등록하고 관리하는 스코프와 코드 실행 순서 관리를 구현한 내부 메커니즘으로, 모든 코드는 실행 컨텍스트를 통해 실행되고 관리된다.
식별자와 스코프는 실행 컨텍스트의 렉시컬 환경으로 관리하고 코드 실행 순서는 실행 컨텍스트 스택으로 관리한다.
실행 컨텍스트 스택
예를 들어 소스코드를 타입으로 분류했을 때, 전역 코드와 함수 코드로 이루어진 소스코드가 있다. 자바스크립트 엔진은 먼저 전역 코드를 평가하여 전역 실행 컨텍스트를 생성한다. 그리고 함수가 호출되면 함수 코드를 평가하여 함수 실행 컨텍스트를 생성한다.
이때 생성된 실행 컨텍스트는 스택 자료구조로 관리된다. 이를 실행 컨텍스트 스택이라고 한다.
코드가 실행되는 흐름에 따라 실행 컨텍스트 스택에 실행 컨텍스트가 차례대로 쌓이고 실행이 끝난 컨택스트는 제거되는 방식으로 진행된다.
렉시컬 환경
렉시컬 환경은 식별자와 식별자에 바인딩된 값, 그리고 상위 스코프에 대한 참조를 기록하는 자료구조로 실행 컨텍스트를 구성하는 컴포넌트다. 렉시컬 환경은 스코프를 구분하여 식별자를 등록하고 관리하는 저장소 역할을 하는 렉시컬 스코프의 실체다.
클로저
외부 함수보다 중첩 함수가 더 오래 유지되는 경우 중첩 함수는 이미 생명 주기가 종료한 외부 함수의 변수를 참조할 수 있다. 이러한 중첩 함수를 클로저라고 한다.
자바스크립트의 모든 함수는 상위 스코프를 기억하므로 이론적으로 모든 함수는 클로저다. 하지만 중첩 함수가 상위 스코프의 식별자를 참조하고 있고 중첩 함수가 외부 함수보다 더 오래 유지되는 경우에 한정하는 것이 일반적이다.
클로저는 상태가 의도치 않게 변경되지 않도록 상태를 안전하게 은닉하고 특정 함수에게만 상태 변경을 허용하기 위해 사용한다.
'면접 준비' 카테고리의 다른 글
[Frontend] 쿠키, 세션, 웹 스토리지 차이점 (0) | 2023.02.02 |
---|---|
[Javascript] 이벤트 버블링(bubbling), 캡처링(capturing) (0) | 2023.02.02 |
[CS] stack과 queue (1) | 2023.02.02 |
[CS] get과 post 차이점 (0) | 2023.01.30 |
[Javascript] var, let, const 차이점 (0) | 2023.01.29 |