자바스크립트 실행 컨텍스트(Execution Context)란?
한 마디로 '코드를 실행하는데 필요한 환경을 제공하는 객체'라고 할 수 있다.
실행 컨텍스트를 이해하기 위해서는 우선, 실행 컨텍스트가 어떻게 구성
되어 있는지를 살펴봐야 한다.
실행 컨텍스트는 아주 빵빵한 구조이지만, 오늘은 여기서 environmentRecord
와 outer-EnvironmentReference
두 가지에 집중해서 살펴볼 것이다.
console.log(a); // undefined → 선언 라인 위에서 출력해도 에러가 나지 않고 변수를 참조한다.
var a = 'Hello';
에러가 발생하지 않는 이유는 자바스크립트 엔진이 먼저 전체 코드를 스캔하면서 변수 같은 정보를 실행 컨텍스트 어딘가에 미리 기록해놓기 때문인데, 이 때 기록해놓는 곳이 environmentRecord
이다.
Variable Hoisting
Function Hoisting
함수 표현식(Function Expression) : 변수 호이스팅과 동일하게 동작
함수 선언문(Function Declaration) : 자바스크립트 엔진이 함수의 선언과 동시에 완성된 함수 객체를 생성해서 environmentRecord에 기록 → 선언 전에도 함수를 사용할 수 있음
/* Global */
let lamp = false;
function goTo2F () {
let lamp = true;
function goTo3F () {
let pet = 'puppy';
console.log(pet); // puppy
console.log(cat); // error → 현재 활성화된 실행 컨텍스트 환경 레코드에 cat이 없으므로 자바스크립트 엔진은 outer를 타고 바깥 렉시컬 환경으로 가서 cat을 찾기 시작한다.
console.log(lamp); // true
};
goTo3F();
console.log(lamp);
}
goTo2F();
2층에서 이미 램프를 찾았기 때문에 더 이상 1층으로 내려가서 찾아보지 않는다. 1층과 2층의 램프가 같은 이름이므로 즉, 식별자가 같기 때문에 1층 램프의 온/오프 여부는 2층 또는 3층에서는 절대 알 수 없다.
이렇게 '동일한 식별자로 인해 상위 스코프에서 선언된 식별자의 값이 가려지는 현상'을 변수 셰도잉(Variable Shadowing)
이라 한다.
코드를 실행할 때 식별자를 더욱 효율적으로 결정하기 위한 수단으로서, 필요한 정보를 한데 모아 제공하는 객체라고 정리할 수 있다!!
※ 참고 자료
코어 자바스크립트
https://www.youtube.com/watch?v=EWfujNzSUmw