- Execution Context (실행컨텍스트)
-> 코드가 실행 되기 위해 필요한 모든 정보를 담고 있는 환경 및 객체.
JS는 같은 객체나 환경에 있는 정보들을 모아놓은 실행 컨텍스트를 Call Stack에 쌓아 실행하여
코드의 순서를 보장 할 수 있다.
또한 어떻게 식별자 (변수, 함수등)와 스코프를 관리하는지 , 그리고 코드 실행 순서를 결정하는 핵심 메커니즘 입니다.
크게 3가지로 나뉘게 되는데
- Global Execution Context (글로벌 실행 컨텍스트)
- 코드가 실행되기 시작할 때 생선되는 기본 컨텍스트 (코드가 로드 되자마자 생성)
- 변수나 함수 선언 등 전역적인 스코프를 가진 식별자들을 관리
- 한 프로그램에는 하나의 글로버 컨텍스트만 존제 합니다.
- Function Execution Context (함수 실행 컨텍스트)
- 함수가 호출 될 때마다 생성
- 각 함수 호출마다 고유한 실핸 컨텍스트가 생성되며, 함수의 매게변수, 지역변수, 그리고 함수 실행에 필요한 다른 정보를 포함
- 실행 컨텍스트 스택, 또는 Call Stack에 푸시되어 관리
- Eval
- 'eval' 함수를 통해 실행되는 코드 블록을 위한 컨텍스트
- 일반적으로 사용을 지양하는 편이 좋으며, 보안상의 이유와 최적화 문제로 인해 사용이 권장되지 않음.
[1] Eval 함수를 권장하지 않는 이유?
-
악의적 코드 실행
-> 주어진 문자열을 코드로 실행하기 때문에, 사용자 입력을 그대로 'eval'에 전달하는 경우 악의적인 스크립트가 실행 될 수 있음.
-
성능 문제
-> 최적화 어려움 : 실행되는 코드는 실행 시간까지 내용이 확정되지 않으므로, 엔진이 사전에 최적화하기 어려움
-
디버깅 어려움
-> 문자열로 된 코드가 실시간으로 실행되기 떄문에, 오류가 발생 했을 때 원인을 찾기가 훨 씬더 복잡해집니다. 추가적으로 코드의 가독성과 유지 보수성도 저하 됨
등이 있으며, 비교적 자유로운 'JSON.parse' 'new Function'을 사용 할 수 있습니다.
** 실행 컨텍스트 내부에는 variable environment, lexical environment, this binding아 있습니다.
- VariableEnvironment
- 변수, 함수선언 그리고 변수의 최신 상태를 기록 합니다.
- 외부 환경 참조 (Outer Lexical Environment Reference) : 외부 스코프와 관련된 정보를 가지며, 스코프 체인을 형성
- this 바인딩 : 실행 컨텍스타가 관련된 객체에 대한 참조
- lexical environment
- 초기에는 Variable Environment와 같지만 변경 사항이 실시간 적용
다시 말해서 초기 상태를 기억 하고 있으며, LexcialEnvironment 최근의 모습을 저장 하고 있음
- this binding
- this 값은 함수 호출 방식에 따라 결정 됨, 이 값은 실행 컨텍스트가 활성화 될떄 설정 되며, 메서드 호출 , 일반 함수 호출, 생성자 호출 등의 다양한 방식에 따라 달라진다.
정리
** 실행 컨텍스트는 자바스크립트 엔진이 코드를 실행하는 방식을 정의하며, 이 구성 요소들은 변수화 함수의 호이스팅, 스코프 결정 , 스코프 체인 형성, 그리고 this 바인딩 방식을 결정
이러한 메커니즘은 JS의 동작 원리를 이해하는데 핵심적인 역할을 하며, 코드의 실행 흐름과 데이터 접근 방식을 정의함.
