Execution ⇒ 실행, Context ⇒ 문맥/맥락/환경
동일한 조건을 지닐 수 있는 조건
즉, 실행 컨텍스트는 함수를 실행할 때 필요한 조건/환경정보를 담은 객체
예제1
// 코드의 결과를 예측해 보자
var a = 1;
function outer() {
console.log(a); // 1
function inner() {
console.log(a); // 2
var a = 3;
}
inner();
console.log(a); // 3
}
outer();
console.log(a); // 4
outer()
실행 함수를 만남outer
함수를 호출함에 따라서 outer
함수의 실행 컨텍스트가 열리면서 outer
함수의 내부에 대해서 한 줄 한 줄 실행하게 됨.console.log
가 출력.inner
함수 선언부는 넘어가고 inner
실행 함수를 만나 그제서야 inner
함수 실행 컨텍스트가 열림console.log
출력inner
함수 호출이 종료되고 세 번째 console.log
출력outer
함수 실행 컨텍스트가 종료되면 네 번째 console.log
출력제일 먼저 들어왔던게 제일 마지막에 빠지고, 제일 마지막에 들어온 게 제일 먼저 빠지는 개념을 “스택”이라고 한다. (마지막으로 제일 처음에 생성되었던 전역 컨텍스트가 사라지는)
코드 실행에 관여하는 스택을 “콜스택” 이라고 한다.
콜스택이란 현재 어떤 함수가 동작중인지, 다음에 어떤 함수가 호출될 예정인지 등을 제어하는 자료구조다.
실행 컨텍스트에는 세 가지 환경 정보들이 담긴다.
LexicalEnvironment
실행 컨텍스트를 구성하는 환경 정보들을 모아 사전처럼 구성한 객체
어휘적 환경, 사전적인 환경
예를 들어 영한 사전은 한글로 설명해주는 내용들로 이루어진 사전인데, 이와 비슷하게 LexicalEnvironment는 어떠한 실행 컨텍스트 A에 대한 환경정보가 담겨있는 사전이다.
호이스팅
// 2-2-1
console.log(a());
console.log(b());
console.log(c());
function a() {
return "a";
}
var b = function bb() {
return "bb";
};
var c = function () {
return "c";
};
****
// {
// function a() { ... },
// b: undefined,
// c: undefined
// }
function a() {
return "a";
}
var b;
var c;
console.log(a());
console.log(b());
console.log(c());
function a() {
return "a";
}
var b = function bb() {
return "bb";
};
var c = function () {
return "c";
};
이렇게 위에 끌어올려진 내용 전체가 바로 environmentRecord다.
실행 컨텍스트가 처음 생성되는 순간에 제일 먼저 하는 일이 이것이다. (정보수집)
현재 컨텍스트에서 선언되어 있는 식별자들이 무엇이 있느냐라는 정보를 코드 순서대로 수집하다 보니 호이스팅한 것이랑 똑같은 개념이 되어 버린 것
스코프 체인
inner
에서 선언한 변수들은 outer
에서는 접근 할 수 없다. outer
에서 선언한 변수들은 inner
에서 접근 가능하다.inner
함수의 environmentRecord는 오직 inner
안에서만 존재하기 때문.inner
에서 ouber
접근은 outerEnvironmentReference를 통해서 접근 할 수 있다.정리
메모