실행 컨텍스트에 대해 알아보기
📌 실행 컨텍스트(Execution Context)
- 코드가 실행되는 환경이라고 생각하면 된다.
- 코드가 실행될 때 자바스크립트 엔진은 해당 코드를 이해하고 처리하기 위해 실행 컨텍스트를 생성한다.
- 변수, 함수 선언, 스코프 체인 등의 정보를 담고 있으며, 코드의 실행을 관리하고 제어한다.
📌 실행 컨텍스트의 역할
- 변수 및 함수 식별자 검색:
현재 실행 중인 코드에서 변수나 함수를 찾을 때, 스코프 체인을 따라 상위 범위까지 올라가며 검색한다.
- 스코프 규칙 적용:
각각의 실행 컨텍스트에 따라 변수와 함수의 유효 범위(Scope)가 결정된다.
- this 바인딩:
현재 실행 중인 함수에서 사용되는 this 키워드가 어떤 객체를 참조하는지 결정한다.
실행 컨텍스트는 자바스크립트 엔진에 의해 내부적으로 관리되며, 코드 블록이 순차적으로 처리될 수 있도록 돕는다.
- 변수 관리:
실행 컨텍스트는 해당 환경에서 선언된 변수와 함수를 관리한다.
이들은 렉시컬 환경(Lexical Environment) 내부의 환경 레코드(Environment Record)에 저장됩니다.
- 스코프 체인 유지:
스코프 체인은 현재 실행 중인 코드에서 접근 가능한 변수와 함수가 저장된 렉시컬 환경의 리스트이다.
이 스코프 체인을 통해 현재 컨텍스트에서 상위 컨텍스트로 변수를 참조할 수 있게 된다.
- 실행 순서 관리:
자바스크립트 엔진은 실행 컨텍스트 스택(Execution Context Stack), "호출 스택(Call Stack)"이라고도 부르기도 한다.
이 스택의 최상단에 위치하는 실행 컨텍스트가 현재 진행 중인 작업이다.
- 클로저 처리:
클로저(Closure)란 내부함수가 외부함수의 맥락(context)에 접근할 수 있는 것을 가리킨다.
실제로 클로저란 자신이 생성됐을 때의 환경(Lexical Environment)을 기억하는 함수를 의미한다.
📍 글로벌 객체(Global Object) = 전역 객체
프로그램의 모든 코드에서 접근 가능한 변수, 함수, 객체를 포함하고 있다.
이는 브라우저 환경에서는 window 객체가, Node.js 환경에서는 global 객체가 해당 역할을 수행한다.
- 자바스크립트에 내장된 여러 가지 기본 값들이 글로벌 객체에 포함되어 있다.
예를 들어 Object, Array, String, Number, Math, Date 등의 생성자 함수와 전역 함수인 isNaN(), parseInt() 등이 이에 해당한다.
- 개발자가 직접 선언한 전역 변수나 함수도 글로벌 객체의 프로퍼티 혹은 메서드가 된다.
- 브라우저나 Node.js와 같은 호스트 환경에서 제공하는 API도 글로벌 객체에 포함된다.
예를 들어 브라우저에서는 DOM 조작을 위한 메서드(document.getElementById())나 타이머 설정을 위한 메서드(setTimeout()) 등이 있으며, Node.js에서는 파일 시스템 접근 API(fs.readFile()) 등이 이에 해당합니다.
fs.readFile()은 Node.js의 파일 시스템 모듈인 fs에 있는 함수이다.
이 함수는 비동기적으로 파일을 읽는데 사용된다.
📍 렉시컬 환경 (Lexical Environment)
- 렉시컬 환경은 실행 컨텍스트 내에서 변수, 함수 선언 등의 정보를 저장하는 객체이다.
- 현재 실행 중인 코드에서 사용 가능한 식별자(변수 및 함수)와 그 값들을 담고 있다.
- 주요 구성 요소로는 환경 레코드(Environment Record)와 외부 렉시컬 환경 참조(Outer Lexical Environment Reference)가 있다.
📍 환경 레코드 (Environment Record)
- 환경 레코드는 식별자(변수 및 함수)와 관련된 바인딩 정보를 담고 있는 일부분이다.
- 주요 역할은 변수 및 함수 식별자의 생성, 검색, 할당 등과 같은 기능을 수행하는 것이다.
- Object Environment Record, Declarative Environment Record가 있다.
📍 Object Binding
- 객체 타입의 값을 처리하기 위한 바인딩 방식입니다.
- 주로 전역 객체(Global Object)나 this 값과 같은 객체 타입의 값에 대한 바인딩에 사용된다.
- Object Binding을 통해 해당 값을 검색하고 접근할 수 있습니다.
예를 들어, 전역 변수는 전역 객체에 바인딩되어 있으며, this 키워드는 현재 실행 중인 함수가 속한 객체에 바인딩됩니다.
📍 Declarative Environment Record
- Declarative Environment Record는 변수 선언과 관련된 바인딩 정보를 담고 있는 특수한 종류의 환경 레코드이다.
- let, const 키워드로 선언된 변수나 함수 선언문이 이러한 방식으로 처리된다.
- Declarative Environment Record는 식별자와 그 값을 직접적으로 연결한다.
- 이러한 변수들은 스코프 내에서 유효하며 호이스팅(Hoisting)되지 않는다.
function myFunc() {
return 'Hello!';
}
📎 정리
실행 컨텍스트는 위에서 설명한 내용들을 조합하여 만들어진다.
각 실행 컨텍스트마다 자신만의 고유한 렉시컬 환경과 환경 레코드가 생성되며, 스코프 체인을 구성한다. 이를 통해 변수와 함수 식별자에 접근하고 값을 할당하거나 검색할 수 있게 된다.
실행 컨텍스트와 그 안에 포함된 요소들이 자바스크립트 엔진에 의해 내부적으로 관리되므로 우리가 직접 다룰 필요 없지만 이러한 개념을 이해한다면 코드 동작 원리를 파악하고 디버깅 시 문제 해결에 도움이 되기때문에 공부해두면 좋을것같다.
실행 컨텍스트를 직접 그려보며 공부하고 velog에도 업로드 할 예정이다.