실행 컨텍스트란?
- 실행 가능한 코드를 형상화하고 구분하는 추상적인 개념
- 실행 가능한 코드가 실행되기 위해 필요한 환경. 일반적으로 실행 가능한 코드는 전역 코드와 함수 내 코드이다.
실행 컨텍스트(Execution Context) 종류
- 전역 실행 컨텍스트: 전역 영역에 존재하는 코드. 특정 함수 안에서 실행되는 코드가 아니라면 코드는 전역 컨텍스트에서 실행한다. 전역 실행 컨텍스트에서는 1) Window 오브젝트인 전역 컨텍스트를 생성하고 2) this를 global Object로 할당한다.
- Eval 실행 컨텍스트: Eval 함수로 실행되는 코드
eval('2+2');
- 함수 실행 컨텍스트: 함수가 호출될 때마다, 해당 함수에 대한 실행 컨텍스트가 생성된다. 각각의 함수들은 자신만의 실행 컨텍스트를 가지지만, 함수가 호출되어야만 만들어진다.
자바스크립트 관련 정보
- 자바스크립트 엔진은 코드를 실행하기 위하여 여러가지 정보를 알고있어야 한다. 실행에 필요한 여러가지 정보란 아래와 같은 것들이 있다.
- 변수: 전역 변수, 지역 변수, 매개 변수, 객체의 프로퍼티
- 함수 선언
- 변수의 유효범위(Scope)
- this
- 이와 같이 실행에 필요한 정보를 형상화하고 구분하기 위해, 자바스크립트 엔진은 실행 컨텍스트를 물리적 객체의 형태로 관리한다.
Execution Context 단계
- Creation Phase
- Execution Phase
Creation Phase
Lexical Environment 컴포넌트 생성
- identifier-variable mapping이 되는 곳이다.
- 즉, 변수와 해당 변수에 대입한 값이 매핑되는 곳이다.
- 함수 선언과 변수(let과 const)의 바인딩을 저장한다.
- this를 결정한다.
Variable Environment 컴포넌트 생성
Execution Phase
Note
- let과 const는 실행 컨텍스트(creation phase)가 만들어 질 때 어떤 값도 가지고 있지 않으나, var은 undefined를 가지고 있다.
- 실행 컨텍스트가 만들어지는 동안, 코드는 변수와 함수 선언을 위해 스캔되기 된다. 이 때, 함수의 선언은 environment에 함수 전체가 다 저장되지만, 변수들은 기본 값으로 undefined나 아직 초기화되지 않은 상태로 저장된다.
- 이 때문에 var 변수가 선언되기 전에, undefined라는 값으로 접근할 수 있는 것이고, let이나 const는 reference error을 얻게 된다.
- 이 것을 우리는 호이스팅이라고 부른다.
- execution phase 동안 자바 스크립트 엔진이 소스 코드에서 let 변수의 값이 선언된 곳을 찾지 못하면 undefined를 할당한다.
https://poiemaweb.com/js-execution-context
https://velog.io/@imacoolgirlyo/JS-%EC%9E%90%EB%B0%94%EC%8A%A4%ED%81%AC%EB%A6%BD%ED%8A%B8%EC%9D%98-Hoisting-The-Execution-Context-%ED%98%B8%EC%9D%B4%EC%8A%A4%ED%8C%85-%EC%8B%A4%ED%96%89-%EC%BB%A8%ED%85%8D%EC%8A%A4%ED%8A%B8-6bjsmmlmgy