
실행할 코드에 제공할 환경 정보들을 모아놓은 객체.
동일한 환경에 있는 코드들을 실행할 때 필요한 환경정보들을 모아 컨텍스트를 구성하고, 이를 콜스택에 쌓아올렸다가, 가장 위에 쌓여있는 컨텍스트와 관련 있는 코드를 실행한다. 실행이 완료되면 콜스택에서 제거된다.
자바스크립트 파일이 열리는 순간, 전역 컨텍스트가 활성화된다.
실행 컨텍스트의 thisBinding에는 this로 지정된 객체가 혹은 전역 객체가 저장된다.
push(), pop()🦊 Stackoverflow 스택의 크기 이상의 자료를 push 하려고 할 때의 오류
실행 컨텍스트를 생성할 때 현재 컨텍스트 내의 식별자들에 대한 정보 + 외부 환경 정보를 담는다.
선언 시점 LexicalEnvironment의 스냅샷으로 초기 상태를 유지한다.
VariableEnvironment에 담긴 정보를 복사한다.
함수 실행 도중 변경되는 사항이 실시간으로 반영된다.
매개변수명, 변수의 식별자, 선언한 함수의 함수명 등 현재 컨텍스트와 관련된 코드의 식별자 정보를 수집한다. (→ 호이스팅)
전역 실행컨텍스트는 자바스크립트 구동 환경이 별도로 제공하는 객체(전역객체)를 활용한다.
코드가 실행되기 전에 변수를 수집하는 과정 (=식별자들을 최상단으로 끌어올린다)
// 원본
function a () {
console.log(b);
var b = 'bbb';
console.log(b);
function b () {}
console.log(b);
}
a();
// 호이스팅
function a () {
var b;
function b () {
console.log(b);
b = 'bbb';
console.log(b);
console.log(b);
}
}
a();
// 함수 표현식
function a () {
var b;
var b = function b () {
console.log(b);
b = 'bbb';
console.log(b);
console.log(b);
}
}
a();
// 함수를 정의하는 세 가지 방식
function a () {} // 함수 선언문. 함수명이 곧 변수명.
var b = function () {} // (익명) 함수 표현식. 변수명이 곧 함수명(= 함수의 name 프로퍼티에 할당).
var c = function d () {} // 기명 함수 표현식 -> d는 굳이..필요없는 함수명
a(); // 실행
b(); // 실행
c(); // 실행
d(); // error
식별자에 대한 유효범위
function loop() {
for(var i = 0; i < 5; i++) {
console.log(i);
}
console.log(i);
}
loop();
/*
0
1
2
3
4
5
*/
function loop() {
for(let i = 0; i < 5; i++) {
console.log(i);
}
console.log(i);
}
loop();
/*
0
1
2
3
4
ReferenceError: i is not defined
*/
let과 const도 호이스팅이 되지만 TDZ에 의해 에러가 발생한다.
변수의 선언 단계와 초기화 단계 사이에 일시적 사각지대(TDZ)가 존재한다.



식별자의 유효범위를 안에서부터 바깥으로 차례로 검색해 나가는 것.
var a = 1;
var outer = function () {
var inner = function () {
console.log(a);
var a = 3;
}
inner();
console.log(a);
};
outer();
console.log(a)
console.dir(inner)debugger전역 컨텍스트의 LexicalEnvironment에 담긴 변수