Scope, Hoisting, This, Function, Closure 등의 동작원리를 담고 있는 자바스크립트의 핵심원리
실행 가능한 코드가 실행되기 위해 필요한 환경
실행 가능한 코드
- 전역 코드
- eval ( ) 함수로 실행되는 코드
- 함수 내에 존재하는 코드가 실행될 경우
실행에 필요한 정보
- 변수
- 함수 선언
- 변수의 유효범위 ( Scope )
- this
const x = 'xxx';
function foo () {
const y = 'yyy';
function bar () {
const z = 'zzz';
console.log(x + y + z);
}
bar();
}
foo();
자바스크립트 엔진은 실행 컨텍스트를 물리적 객체의 형태로 관리한다.
3가지의 프로퍼티로 실행에 필요한 정보들을 보관한다.
자바스크립트 엔진은 실행에 따라 여러 정보들을 담을 객체를 생성하는데 이를 VO라고 한다.
코드가 실행될 때 엔진에 의해 참조되며 코드에서는 접근 불가하다.
Variable Object에 담긴 정보
- 변수
- 매개변수 ( Parameter ) 와 인수 ( Arguments )
- 함수 선언 ( 함수 표현식은 제외 )
Variable Object는 실행 컨텍스트의 프로퍼티이기 때문에 값을 갖는데 이 값은 다른 객체를 가리킨다.
→ 여기서 전역 컨텍스트와 함수 컨텍스트의 Variable Object는 서로 다른 객체를 가리킨다.
( 전역 코드와 함수 코드의 내용이 다르기 때문 )
Variable Object는 전역 객체 (Global Object / GO) 를 가리킨다.
전역 객체 (GO)는 최상위에 위치하면서 유일하고, 모든 전역 변수, 전역 함수 등을 포함한다.
전역 객체 (GO)는 전역에 선언된 전역 변수와 전역 함수를 프로퍼티로 소유한다.
Variable Object는 활성 객체 (Activation Object / AO)를 가리킨다.
활성 객체 (AO)는 매개변수와 인수들의 정보를 배열의 형태로 담고 있는 객체인 Arguments Object가 추가된다.
활성 객체 (AO)는 앞으로 쓸 매개변수, 사용자가 정의한 변수 및 객체를 저장하고 새로 만들어진 컨텍스트에 접근 가능하도록 만들여졌다.
스코프 체인은 식별자 중에서 변수를 검색하는 메커니즘으로 사용된다.
해당 전역 또는 함수 컨텍스트의 변수 객체 (VO)가 가리키는 전역 객체 (GO)와 활성 객체 (AO)의 참조로 이루어진 리스트이다.
현재 실행 컨텍스트의 활성 객체를 선두로 하여 순차적으로 상위 컨텍스트의 활성 객체를 가리키며 마지막으로 전역 객체를 가리킨다.
스코프 체인을 통해 하위함수에서 상위함수의 스코프까지 참조가 가능하다.
( 함수가 중첨되어 있으면 부모함수의 스코프가 자식함수의 스코프 체인에 포함되기 때문 )
위 이미지를 설명하면 :변수를 파악하기 위해 먼저 현재 스코프 즉, AO에서 검색하고 존재하지 않으면 스코프 체인에 담긴 순서대로 검색을 하게 된다.
예) AO → AO → ··· → GO
스코프가 중첩된 모든 상황에서 발생한다.
자바스크립트 엔진은 변수 ( 식별자 ) 를 찾을 때 제일 먼저 자신이 속한 스코프에서부터 검색하고,
그 스코프에 찾는 변수가 없으면 상위 스코프를 타고 올라가서 순차적으로 검색한다.
상위 스코프에서 하위 스코프에 선언된 변수로는 접근 불가하다.
정리하자면 :실행문의 위치를 기준으로 하위 스코프부터 시작해 원하는 값을 찾을 때까지 상위 스코프를 타고 올라가며 탐색해 가는 것이 스코프 체인의 가장 기본적인 작동방식이다.
위 예시를 계층 구조로 나타내면 :