실행 컨텍스트 (Excution Context)

실행 컨텍스트란?

실행컨텍스트는 “실행 가능한 코드가 실행되기 위해 필요한 환경”을 의미한다.

“실행 가능한 코드?”, “실행되기 위해 필요한 환경?” 의미가 직관적으로 와닿지 않을 수도 있다. 따라서 조금 더 쉽게 풀어 쓰자면, 그냥 자바스크립트에서 코드가 실행되는 원리와 과정을 담은 객체이자 개념이라고 이해해도 무방하다.

실행컨텍스트를 확실하게 학습해야 this, 호이스팅, 클로저, 스코프 등, 자바스크립트에서 코드가 어떻게 관리되고 실행되는지를 명확하게 이해할 수 있다. 따라서 이번 기회에 실행 컨텍스트를 확실하게 학습하고 넘어갈 수 있도록 해보자!


실행 가능한 코드

위에서 실행 컨텍스트를 “실행 가능한 코드가 실행되기 위해 필요한 환경”이라고 정의했다.
그렇다면 여기서 실행 가능한 코드란 무엇을 의미하는 걸까?

먼저 결론부터 말하자면, 실행 가능한 코드에는 전역 코드, 함수 코드, eval코드, 모듈 코드가 있다. 하지만 eval함수는 보안상의 이유로 거의 사용되지 않기 때문에, 이번 포스팅에서 실행 가능한 코드 = 전역 코드, 함수 코드라고 이해하면 편할 것이다.

코드 설명
전역코드 전역에 작성되어 있는 코드를 의미한다. 함수나 클래스 내부 코드는 포함하지 않는다.
함수코드 함수 내부에 작성되어 있는 코드를 의미한다. 하지만, 내부 함수 또는 내부 클래스의 내부 코드는 포함하지 않는다.
모듈코드 하나의 독립적인 파일에 작성된 코드라고 생각하면 된다. 보통 모듈화된 코드는 import를 통해 불러와서 사용한다.
1
2
3
4
5
6
7
8
9
import moduleCode from '../constants'; // 모듈 코드 (이처럼 모듈화된 코드를 모듈 코드라 한다)

var year = 2022; // 전역 코드

function getName() {
// 전역 코드 (선언문 까지는 전역코드에 속한다)
var name = 'hoon'; // 함수 내부에 있는 코드는 함수 코드다.
console.log(name);
}

실행 컨텍스트의 개괄적 형태와 동작 방식

코드가 실행되기 위한 환경에 대해 다루기에 앞서, 실행 컨텍스트가 어떤 형태를 띄는지와 어떻게 실행되는지에 대해 먼저 짚고 넘어가도록 하자.

결론부터 얘기하자면, 실행 컨텍스트는 코드 실행을 위해 필요한 정보들을 저장해둔 객체다. 그리고 이 실행 컨텍스트는 스택(stack)으로써 동작한다.

위 사진과 같이, 실행 컨텍스트는 크게 변수객체, 스코프 체인, this값을 프로퍼티로써 저장하여 관리한다. 정말 러프하게 이를 코드로 표현한다면 아래와 같이 표현할 수 있을 것이다.

1
2
3
4
5
const 실행컨텍스트 = {
변수객체 : {/* 변수, 매개변수, 함수 선언, 인자(arguments) */},
스코프 체인: [],
this값 : {}
};

그리고 아래에서 더 자세히 설명하겠지만, 코드의 종류에 따라 생성되는 실행 컨텍스트의 종류도 각각 다르다. 전역 코드는 전역 실행 컨텍스트를, 함수는 함수 실행 컨텍스트를 생성한다. 또한, 언제나 전역 실행 컨텍스트가 먼저 생성되어 stack에 쌓인다.

stack이란 아래에서 위로 쌓이는 자료구조로, 나중에 들어온 코드가 먼저 실행되는 LIFO(후입선출) 방식의 매커니즘을 따른다.

이에 따라, 아래와 같은 코드의 실행 컨텍스트 스택 동작 방식은 그림과 같다.

1
2
3
4
5
6
7
8
var year = 2022;

function foo() {
function bar() {}
bar();
}

foo();

위 사진과 같이, 전역 실행 컨텍스트가 먼저 생성되어 stack에 담기고, 순차적으로 이후의 함수 실행 컨텍스트들이 쌓인다. 그리고 LIFO(후입선출법) 방식에 따라 마지막에 쌓인 실행 컨텍스트 순으로 코드가 실행된다.(실행이 완료된 코드의 실행 컨텍스트는 실행 완료 이후 소멸된다)


코드의 평가 & 실행

위에서 언급한 ‘실행 가능한 코드’들은 모두 실행 컨텍스트를 생성한다.
그리고 상술했듯, 코드의 종류에 따라 생성되는 컨텍스트의 종류 또한 각각 차이가 있다.

먼저, 자바스크립트 엔진이 코드를 실행하는 과정은 “코드의 평가 → 코드의 실행”의 순서를 따른다.

코드 평가

이 단계에서 실행 컨텍스트를 생성한다.

평가 단계에서는 변수와 함수의 선언문 만을 전담하여 실행한다. 그리고 이들을 key로써 실행 컨텍스트가 관리하는 스코프에 등록하는 것이다.

그리고 주의해야 할 점은, 평가 단계에서는 변수 또는 함수 선언문의 값들을 undefined로 초기화 한다는 것이다.(let, const, 함수 표현식은 예외)

1
2
var year;
year = 2022;

위의 예시를 통해 설명하자면, 코드 평가 과정에서는 yearundefined로 실행컨텍스트에 저장해 둔다. (선언문만 실행)

코드 실행

위와 같은 코드 평가 과정이 끝나면, 바로 코드를 실행한다.

코드 평가 과정에서 선언문에 대한 실행을 마쳤으므로, 코드 실행 과정에서는 선언문을 제외한 코드들이 실행된다. 즉, 소스코드 실행 단계에서는 호출문, 할당문 등이 실행된다고 생각하면 된다.

따라서, 위의 코드에서는 year = 2022; 만 실행하면 되는데, 여기서 할당문을 무작정 실행하는 것은 아니다. 변수 할당문을 실행하기 전에, 자바스크립트 엔진은 해당 변수가 선언된 변수인지 우선적으로 체크한다. 이 체크(검색) 과정은 선언문 코드를 다시 실행하는 방식이 아니라, 실행컨텍스트가 관리하는 스코프에 체크하고자 하는 변수 year가 등록되어 있는지 확인하는 방식을 따른다. 이에 따라, 위에서 yearundefined로 초기화 한 상태이기 때문에 정상적으로 할당문이 실행되어 값 2022가 할당된다.

즉, 위와 같이 2022라는 값이 실행 컨텍스트에 저장되는 것이다.


중간 정리

지금까지 실행컨텍스트가 코드 실행을 위한 정보들을 저장하고 관리하는 하나의 객체라는 것, 그리고 코드를 실행할 때 스택 자료구조로써 평가→실행의 과정을 따른다는 점을 학습했다.

현재까지 학습한 내용들을 토대로, 아래의 코드가 실행 컨텍스트로써 어떻게 실행되는지 확인하며 중간 정리를 해보도록 하자.

1
2
3
4
5
6
7
8
9
var name = 'hoon';
var gender = 'male';

function getCountry() {
var country = 'Korea';
console.log(name + 'is from' + country);
}

getCountry();

위의 코드의 stack 동작 구조는 이하와 같을 것이다. (전역 실행 컨텍스트 → 함수 실행 컨텍스트 순)

가장 먼저 전역 객체가 생성된 후, 전역 실행 컨텍스트가 스택에 먼저 쌓인다. 즉, 전역 코드가 먼저 실행된다는 것이다. 위 코드에서 전역 코드는 전역에서의 모든 선언문을 의미한다. 따라서 우선적으로 전역코드의 코드 평가가 먼저 이루어진다.

전역 코드의 평가 → 실행

name, gender, getCountry가 전역 실행 컨텍스트에 초기화되어 저장된다. 그리고 평가가 끝나면 바로 코드들이 실행되는데, 코드 순서에 따라 namegender에 값이 할당되고 → getCountry()가 호출된다.

함수 코드의 평가 → 실행

위에서 getCountry 함수가 호출됐기 때문에, 전역 실행 컨텍스트 위에 getCountry 함수 실행 컨텍스트가 쌓인다.

이에 따라, getCountry함수 내에 작성된 코드들이 평가 → 실행되는 과정이 여기서도 동작한다. 우선, 위와 동일하게 함수 내에 선언된 변수가 평가되어 country라는 변수가 초기화 되어 실행 컨텍스트에 저장된다. 여기서 주의할 점은, 여기서의 실행 컨텍스트는 전역 실행 컨텍스트가 아닌 getCountry만의 함수 실행 컨텍스트라는 것이다. 즉, country 변수는 함수 실행 컨텍스트에 초기화 되어 등록된다.

이제 함수 코드의 평가가 끝나면 코드가 실행된다. 코드 실행에 따라 country 변수에는 ‘Korea’라는 값이 할당되고, console.log()가 호출될 것이다. 물론 console.log()도 하나의 메소드이자 함수이므로 또 다른 함수 실행 컨텍스트를 생성하지만 여기서는 생략하도록 하겠다.

그러면 getCountry 함수의 실행이 끝났으므로 해당 함수 실행 컨텍스트는 소멸되고 스택에서도 제거된다(pop). 그리고 이후 전역 실행 컨텍스트까지 소멸 후 스택에서 제거되며 모든 코드의 실행이 종료된다.

이처럼, 모든 코드의 실행은 실행 컨텍스트를 통해 이루어진다.
실행 컨텍스트에 식별자와 스코프가 저장되고, stack 자료구조의 매커니즘에 따라 각 코드들이 호출 및 실행된다.

여기까지가 실행 컨텍스트의 개괄적인 흐름이었다고 치면, 아래부터는 실행 컨텍스트에 어떻게 식별자와 스코프가 저장되고 관리되는지렉시컬 환경”이라는 개념을 통해 학습할 것이다. 복잡해보이고 어려워보이는 단어들이 등장할 예정이지만, 알고 보면 그렇게 어려운 내용은 아니기에, 천천히 잘 따라오기만 하면 될 것이다.


렉시컬 환경

렉시컬 환경은 실행 컨텍스트의 원리를 이해하는 데 굉장히 중요한 부분이다.
이는 하나의 자료구조로써, 식별자와 그 값, 그리고 스코프를 관리한다.

렉시컬은 사전적으로 “어휘”를 의미한다. 따라서 렉시컬 환경이라 함은, 어휘적 환경이라고 할 수 있는데, 어느정도 일리가 있는 말이다. 식별자와 스코프는 결국 어휘, 언어, 또는 이름과 관련된 개념들로써, 이는 렉시컬이라는 의미에 포섭될 수 있는 개념이라고 볼 수 있기 때문이다.

렉시컬 환경의 구성요소

그렇다면 렉시컬 환경이 정확하게 무엇일까?

렉시컬 환경은 실행 컨텍스트의 구성요소 중 하나다. 원래는 렉시컬 환경 내에 LexicalEnvironmentVariableEnvironment라는 컴포넌트가 각각 존재하지만, 이번 포스팅에서는 이 두 컴포넌트를 “렉시컬 환경”이라고 통칭하도록 하겠다.

이 렉시컬 환경이라는 것은 “환경 레코드”와 “외부 렉시컬 환경에 대한 참조“라는 컴포넌트로 구성되어 있다. 환경 레코드는 스코프 내에서의 식별자를 등록하고, 식별자에 바인딩 된 값(value)을 관리한다. 그리고 “외부 렉시컬 환경에 대한 참조”는 상위 스코프와의 체이닝(연결)의 주축이다. 이 컴포넌트는 상위 스코프(상위 코드의 렉시컬 환경)를 가리킨다.

말이 어렵게 느껴질 수 있지만, 이 두 컴포넌트는 확실하게 짚고 넘어가야 하는 부분이기에 그림을 통해 조금 더 자세히 설명해보도록 하겠다.

위의 그림처럼, 렉시켤 환경 내에서 환경 레코드는 변수명과 같은 식별자와 그 값을 등록하고 저장해둔다. 그리고 “외부 렉시컬 환경에 대한 참조”는 상위 스코프를 가리키는데, 이는 상위 렉시컬 환경을 의미한다.(만약 현재 실행 컨텍스트가 전역 실행 컨텍스트라면 현재의 렉시컬 환경이 최상위일 것이기에 상위 스코프는 어떠한 것도 참조하지 못한다)


실행 컨텍스트의 동작 과정 (Feat. 렉시컬 환경)

이제 마지막으로, 실행 컨텍스트가 정확하게 어떻게 동작하는지 예제 코드와 함께 살펴보도록 하자.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
var a = 1;
const b = 2;

function foo(num) {
var a = 3;
const b = 4;
function bar(num2) {
const c = 5;
console.log(a + b + c + num + num2);
}
bar(10);
}

foo(100);

코드만 먼저 봤을 때는, 왜 varconst를 혼용해서 썼는지 의문이 먼저 들 수 있지만, 이는 아래에서 자연스럽게 설명될 부분이니 잠시 궁금증을 내려놓아도 된다.

이제 위의 예제 코드가 실행 컨텍스트에 의해 어떻게 실행되는지 차근차근 짚고 넘어가볼 것이다.


전역 객체 생성 → 전역 코드 평가 및 실행

가장 먼저 실행되는 코드는 전역 코드이므로, 전역 객체 생성, 그리고 전역 코드 평가 및 실행 단계가 우선적으로 진행된다.

전역 객체를 생성

우선, 모든 코드가 로드되기 전에 전역 객체가 생성된다. 이 전역 객체 안에는 자바스크립트 내장 전역 함수와 프로퍼티, 객체 등으로 구성된다. 쉽게 말하면, 자바스크립트의 기본적 전역 객체 구성요소들이 구성되는 것이라고 생각하면 된다.

이제 코드가 로드되고 전역 객체가 생성되면, 위에서 학습했던 바와 같이 전역 코드의 평가가 시작된다. 직전에는 코드 평가 및 실행의 개략적 플로우 정도만 간단히 살펴봤다면, 이번에는 정확히 어떤 곳에 어떤 정보들이 담기고 활용되는지 세부적으로 학습해보도록 하자.(렉시컬 환경)

큰 틀에서의 전역 코드에 대한 평가 및 실행 과정은 이하의 사진과 같다.

전역 실행 컨텍스트의 생성

먼저, 전역 실행 컨텍스트가 생성된다.

그리고 바로 전역 렉시컬 환경이 생성되는데, 상술했듯 이 전역 렉시컬 환경에는 “전역 환경 레코드”“외부 렉시컬 환경에 대한 참조” 컴포넌트가 구성된다. 바로 아래에서 살펴보도록 하자.

전역 렉시컬 환경을 생성

그 중에서도 먼저 전역 환경 레코드를 먼저 생성한다.

위의 사진과 같이, 전역 환경 레코드는 특별하게도 두 개의 레코드로 구성된다. ES6 이전에는 var만 존재했지만, letconst가 등장하며 varlet&const가 저장되는 레코드가 이원화 되었다. 이에 따라, var 전역 변수와 전역에서 선언된 함수는 “객체 환경 레코드“ 컴포넌트에 저장되고, constlet 전역 변수는 “선언적 환경 레코드” 컴포넌트에 저장된다.

객체 환경 레코드 생성

객체 환경 레코드에서의 핵심은,
객체 환경 레코드가 BindingObject라는 객체와 연결된다는 것이다.

객체 환경 레코드에 저장된 var 전역 변수와 전역 함수는 이 BindingObject를 통해 전역 객체의 프로퍼티와 메소드가 된다. 즉, 이 변수와 함수들은 window.OOO을 통해 호출할 수 있게 된다는 것이다. (객체 환경 레코드가 보유하는 BindingObject는 전역 객체를 가리킨다. 따라서 이 BindingObject를 통해 전역 객체와 연결되어 객체 환경 레코드에 해당하는 전역 변수와 전역 함수가 전역 객체에 등록될 수 있는 것이다.)

따라서 예제코드에서 var로 선언한 전역변수 a와 함수 선언문에 의한 전역 함수 fooBindingObject에 의해 전역 객체에 등록된다 (위 사진 참고).

그리고, 전역 변수는 위의 사진과 같이 undefined로 초기화 되지만, 함수 선언문으로 정의된 전역 함수 foo는 평가 직후 전역 객체에 함수 객체로써 즉시 할당된다. 이 때문에 함수 선언문으로 정의된 전역 함수는 선언문 이전에 호출될 수 있는 것이다.

다시, 함수 선언문으로 정의된 전역 함수는 BindingObject에 의해 전역 객체에 평가 직후 즉시 할당된다. 이 때문에 우리는 함수 선언문 이전에 함수를 호출할 수 있는 것이다!

선언적 환경 레코드 생성

letconst로 선언된 변수가 여기에 저장된다. (letconst로 표현된 함수도 포함)

위의 예제 코드에서 constb를 선언했기 때문에 b가 이 선언적 환경 레코드에 등록될 것이다. 하지만 이전 포스팅에서 다뤘듯, letconst선언과 초기화의 과정이 분리되어 이루어지기 때문에 런타임이 해당 선언문에 도달하기 전 까지는 초기화가 되지 않는다. (TDZ가 발생하는 이유가 바로 이 것!)

여기서 런타임이란, 코드의 실행을 의미한다. 따라서 코드 평가 과정에서는 이 변수들이 초기화 되지 않아 메모리 공간이 확보되지 않는다는 것이다.

this 바인딩

전역 환경 레코드의 마지막 구성요소다.
전역 환경 레코드 내에는 객체 환경 레코드와 선언적 환경 레코드 외에, [[GlobalThisValue]] 라는 내부 슬롯이 존재한다.

[[GlobalThisValue]] 내부 슬롯에 this가 바인딩 된다. 현재는 전역 코드에 대한 실행 컨텍스트를 다루고 있기에 당연히 현재는 전역 객체가 this에 바인딩 될 것이다(window).

외부 렉시컬 환경에 대한 참조 결정

마지막으로 상위 스코프를 가리키는 “외부 렉시컬 환경에 대한 참조”를 결정한다. 하지만 현재 실행 컨텍스트는 전역 실행 컨텍스트이므로, 상위 스코프가 존재하지 않는다. 이에 따라 전역 렉시컬 환경에서의 “외부 렉시컬 환경에 대한 참조” 값은 null이다.

코드 실행

이제 모든 코드에 대한 평가가 끝났으므로 선언문 이외의 코드들이 실행된다.

ab에는 각각 1과 2가 할당될 것이다. 그리고 foo 함수가 호출된다. 이제 아래에서 foo 함수가 어떻게 실행되는지 살펴보도록 하자.


foo 함수 코드 평가 및 실행

foo 함수가 호출되면, foo 함수 실행 컨텍스트가 생성된다.
그리고 함수 렉시컬 환경이 구축된 뒤에 → 실행 컨텍스트 스택에 쌓인다.(push)

함수 렉시컬 환경 생성

함수 호출 뒤에 함수 실행 컨텍스트가 생성됐다.
이제 실행 컨텍스트 스택에 함수 실행 컨텍스트가 쌓이기 전, 함수 렉시컬 환경이 먼저 생성되어야 한다.

함수 환경 레코드에 등록되고 관리되는 정보들

함수 렉시컬 환경 또한 “환경 레코드“와 “외부 렉시컬 환경에 대한 참조” 컴포넌트로 구성된다. 하지만 전역 환경 레코드와는 다르게 함수 환경 레코드는 이원화 되어 관리되지 않는다. 즉, “함수 환경 레코드”라는 하나의 컴포넌트에서 함수의 매개변수, arguments 객체, 지역변수, 내부함수(중첩함수)를 등록 및 관리한다.

this 바인딩

전역 환경 레코드와는 다르게, 함수 환경 레코드에는 [[ThisValue]] 내부 슬롯이 존재한다.

하지만 이전 포스팅에서 다뤘듯, 함수에서의 this값은 어떻게 호출했느냐에 따라 달라진다. foo 함수는 일반 함수로써 전역에서 호출됐기에 전역 객체가 바인딩 된다.

외부 렉시컬 환경에 대한 참조

foo 함수는 전역에서 선언된 전역 함수다. 따라서 foo 함수의 평가 자체는 전역 코드의 평가 과정에서 이루어진다. 이러한 이유로써 foo 함수는 전역 렉시컬 환경을 참조하며 이와 연결된다.

추가적으로, 이전 포스팅에서 렉시컬 스코프는 “함수가 선언된 위치”에 따라 상위 스코프가 결정된다고 설명했었다. 이는 자바스크립트 엔진이 함수 선언 코드(전역 코드)를 평가하는 과정에서 함수 객체를 생성할 때 [[Environment]] 내부 슬롯에 상위 스코프를 저장하기 때문이다. 이 부분에 대해서는 이후에 다룰 클로저 포스팅에서 자세하게 다룰 예정이니, 함수 객체에 [[Environment]] 내부 슬롯이 존재하고, 이 내부 슬롯에 상위 스코프가 저장된다는 것만 가볍게 기억하고 넘어가면 된다.

foo 함수의 실행

이제 foo 함수의 렉시컬 환경이 구성되며 코드 평가가 끝났다.

아래의 그림과 같이 식별자 검색 이후 → foo 함수의 렉시컬 환경에서 모든 식별자들을 찾아 할당해준다.


bar 함수 코드 평가 및 실행

평가 및 실행의 과정이 foo 함수와 거의 비슷하기에 이 부분은 간략하게 중점만 설명하도록 하겠다.

bar 함수의 렉시컬 환경 생성

렉시컬 환경을 생성하며 코드 평가가 이루어진다. 먼저 함수 환경 레코드에 num2 매개변수와 c 식별자, 그리고 arguments 객체가 등록된다. 물론 여기서도 cconst에 의해 정의되었기 때문에 절대 undefined로 바로 초기화 되지 않는다.

이후 bar 함수가 내부함수기 때문에 [[ThisValue]] 는 또 다시 전역 객체를 바인딩 한다. 그리고 외부 렉시컬 환경에 대한 참조는 자신의 상위 함수인 foo 렉시컬 환경을 참조하게 된다.

bar 함수 코드의 실행

마지막으로 bar 함수 코드가 실행된다.

num2에는 10이, c에는 5가 할당된다. 그리고 console.log()가 호출된다.

console.log()의 실행 과정은 이전의 체이닝 과정과 거의 유사하다. console 식별자를 현재 실행중인 실행 컨텍스트의 스코프 체인 내에서 우선적으로 검색하고 → 외부 렉시컬 환경을 타고 가다가 결국 전역 객체에서 이를 찾는다. → 검색된 console 객체 안에서 또 log라는 내부 메소드를 찾아서 실행한다.

그리고 최종적으로 표현식의 각 값들(a + b + c + num + num2)을 식별자 검색을 통해 검색한다. 이 또한 외부 렉시컬 환경에 대한 참조를 통해 검색하는 것이다. 그렇게 각 값들을 찾은 뒤 console.log() 메소드에 전달하여 실행시킨다. 그렇게 bar 함수의 모든 코드들은 실행이 완료된다.


순차적 코드 실행 종료(pop)

이제 bar → foo → 전역 실행 컨텍스트 순으로 stack에서 차례대로 제거된다.

하지만 여기서 유의해야 할 점이 있는데, 실행 컨텍스트가 pop되어 소멸된다고 하더라도, 렉시컬 환경 또한 함께 소멸되는 것은 아니라는 것이다. 렉시컬 환경은 실행 컨텍스트에 바인딩 된 구성요소이긴 하지만, 결국 하나의 독립적인 객체다. 따라서 자신을 참조하고 있는 데이터가 사라질 때 비로소 가비지 컬렉터에 의해 제거된다. (즉, 실행컨텍스트가 소멸되어도, 자신이 피참조되고 있을 경우에는 삭제되지 않는다는 것이다.)


정리 및 요약

실행 컨텍스트는 자바스크립트에서 코드들이 실행되기 위해 필요한 환경이자 객체다.

  1. 실행 가능한 코드들(전역 코드, 함수 코드, 모듈 코드 등)은 각각 실행 컨텍스트를 생성한다. (ES6 이후부터는 블록문도 독립적인 실행 컨텍스트를 생성함)
  2. 전역 실행 컨텍스트가 먼저 생성되고 이후의 실행 가능한 코드들의 실행 컨텍스트가 차례대로 생성 및 실행된다.
  3. 순서는 실행 컨텍스트의 생성 → 렉시컬 환경 생성(코드의 평가) → 코드의 실행 순이다.
  4. 렉시컬 환경의 구성요소는 “환경 레코드”, “외부 렉시컬 환경에 대한 참조” 컴포넌트다.
  5. 전역 환경 레코드의 경우 객체 환경 레코드와 선언적 환경 레코드(let, const)로 이원화 되어 관리된다.
  6. 환경 레코드를 통해 식별자와 this값 등이 등록되고 관리된다.
  7. 환경 레코드의 구성이 끝나면 “외부 렉시컬 환경에 대한 참조”를 통해 외부(상위) 렉시컬 환경과 연결된다.
  8. 코드의 평가가 끝나면 코드가 실행되며 식별자 검색을 통한 값 할당 및 함수 호출 등이 이루어진다.

참조한 자료

도서 : 모던 자바스크립트 Deep Dive .이웅모

Understanding Execution Context and Execution Stack in Javascript

Understanding JavaScript Execution Context By Examples


Author

Hoonjoo

Posted on

2022-04-10

Updated on

2022-04-13

Licensed under

Comments