Just Do IT!
[JavaScript] 실행 컨텍스트 본문
728x90
반응형
1. 실행 컨텍스트란?
- 스택(stack) : Last in, first out
- 실행 컨텍스트 : 실행할 코드에 제공할 환경 정보들을 모아놓은 객체
- 콜 스택(call stack) 안에 실행 컨텍스트가 모아져 있다.
- 가장 위에 쌓여있는 컨텍스트와 관련된 코드를 실행하는 방법으로 코드의 환경 및 순서를 보장 (LIFO)
- 컨텍스트의 구성 방법
- 전역 공간
- eval() 함수
- 함수 ☞ 우리가 흔히 실행 컨텍스트를 구성하는 방법
실행컨텍스트 구성 예시
- 실행 컨텍스트 객체
- 생성(활성화) 시점 : 한 '실행 컨텍스트'가 콜 스택의 맨 위에 쌓이는 순간이 곧 현재 실행한 코드에 관여하게 되는 시점
- 생성 시점에 JS 엔진은 해당 컨텍스트에 관련된 코드를 실행하는데 필요한 환경 정보들을 수집해서 실행 컨테스트 객체에 저장
- 실행 컨텍스트에 담기는 정보
- Variable Envrionment
- 현재 컨텍스트 내의 식별자 정보
- 외부 환경 정보
- 선언 시점 Lexical Envrionment의 snapshot (그 순간을 찍어 놓은 것)
- Lexical Envrionment
- Variable Envrionment와 동일하나 변경사항이 실시간으로 반영
- This Binding
- this 식별자가 바라봐야할 객체
- this가 의미하는 게 무엇인지 생각
- Variable Envrionment
2. Variable Envrionment 와 Lexical Envrionment 비교
- 담기는 내용은 동일하다
- snapshot 유지 여부 : Variable Envrionment는 유지
- 실행 컨텍스트를 생성할 때 Variable Envrionment에 정보를 먼저 담은 다음, 이를 그대로 복사해서 Lexical Envrionment를 만들고 이후엔는 주로 Lexical Envrionment를 활용
- 구성 요소
- 모두 동일 → envrionment Record와 outer Envrionment Reference로 구성
- envrionment Record = record
- outer Envrionment Reference = outer
3. Lexical Environment
- 개요
- 현재 컨텍스트와 관련된 코드의 식별자 정보들이 저장(수집) = 기록된다(record)
- 수집 대상 정보 : 함수에 지정된 매개변수 식별자, 함수 자체, var로 선언된 변수 식별자 등
- 컨텍스트 내부를 처음부터 끝까지 순서대로 훑어가며 수집 (코드가 실행되는 것 X)
- 호이스팅
- 변수 정보 수집을 모두 마쳤더라도 아직 실행 컨텍스트가 관여할 코드는 실행 전의 상태이다
- = JS 엔진은 코드 실행 전 이미 모든 변수 정보를 알고 있는 것
- 변수 정보 수집 과정을 이해하기 쉽게 설명한 '가상 개념'
호이스팅 규칙
1, 매개변수 및 변수에 대한 호이스팅
2. 함수 선언의 호이스팅
3. 함수 선언문, 함수 표현식
- 함수 선언의 3가지 방식
- 함수 선언문, 함수 표현식
- 함수 선언문을 주의해야 하는 이유
- 만약 함수 표현식이었다면
- 잘 동작하지 않는다
- 그렇지만 2번 개발자가 1번 개발자의 코드에 영향을 미치지 않음
4. Lexical Envrionment
- 스코프 (Scope)
- 식별자에 대한 유효범위
- 대부분의 언어에서 존재하며, JavaScript에서도 존재
- 스코프 체인
- 식별자의 유효범위를 안에서부터 바깥으로 차례로 검색해나가는 것
- outer Envrionment Reference (= outer)
- 스코프 체인이 가능하도록 하는 것
- 외부 환경의 참조 정부를 가지고 있는 것
스코프 체인에 대한 예제
+)
전역 변수 : 전역 공간에서 선언한 변수
지역 변수 : 함수 내부에서 선언한 변수
JS 심화 문법 강의를 듣고 정리한 것이다.
ch2의 내용이지만.. 다른 부분은 정리할 게 남아 있어서 그냥 ch2부터 정리했다.
728x90
'개발 공부 > JavaScript' 카테고리의 다른 글
[JavaScript] 계산기 만들기 (HTML+CSS+JS) (1) | 2023.03.23 |
---|---|
[JavaScript] lodash 라이브러리 (0) | 2023.02.02 |
[JavaScript] 정규 표현식 (Regular Expressions) 이해하기 (0) | 2022.12.16 |
[JavaScript] async와 defer의 차이점 (0) | 2022.12.02 |
[JavaScript] DOM 기초 (0) | 2022.12.01 |