August 13th 2018
Contents
자바스크립트 실행문맥의 이해하기
자바스크립트의 호스팅 환경이 웹브라우저라고 할 때, 웹브라우저의 자바스크립트 엔진이 우리가 쓴 코드를 실행시켜 줍니다. 자바스크립트의 대표적인 엔진으로는 Google의 V8엔진이 있고, 그 외에 Rhino, SpiderMonkey, JavascriptCore 등이 있습니다. 우선, 아래와 같이 자바스크립트 코드가 어떻게 읽히는지 간략히 정리해 보았습니다.
자바스크립트 애플리케이션을 실행하면, 자바스크립트 interpreter는 현재 실행중인 특정 코드 맥락에 사용할 변수와 그 변수에 할당되는 값이 저장되는 공간을 별도로 생성합니다. 이 메모리 공간을 실행문맥 (Execution contexts)이라고 부릅니다.
자바스크립트에서는 어떠한 함수가 호출될 때마다 새로운 Execution context가 생겨나고, 일반적으로 함수 내 코드 실행이 완료되면 해당 Execution context도 사라지게 됩니다.
var name = 'John';
function first() {
var a = 'Hello!';
seconed();
var x = a + name;
}
function second() {
var b = 'Hi!';
var z = b + name;
}
first();
위의 코드를 예로 아래와 같이 도식화 해 보았습니다. 새로운 함수가 호출되면 현재의 실행문맥위에 새로운 실행맥랑이 형성됩니다. 그리고 해당 함수가 끝나면 직전의 실행맥락으로 돌아갑니다.
하지만, 웹애플리케이션이 실행되고 종료될 때까지 사라지지 않는 실행문맥이 있습니다. Global execution context인데, 웹애플리케이션을 실행하면, 기본적으로 Global context가 밑바탕에 흐르고 있다고 생각할 수 있습니다. Global execution context는 어떠한 함수 내부에 위치하지 않은 변수 및 함수를 포함하고 있습니다.
각 실행문맥은 아래와 같은 3가지 프로퍼티를 소유합니다.
Scope 내 변수 및 함수(Local, Global)
전달 인자(arguments)
호출된 근원 (caller)
This variable
a. Variable Object(VO)를 생성함.
자바스크립트의 실행문맥은 Scope와 관련이 있기 때문에, Execution context와 Scope를 혼동할 수 있습니다. 하지만, Scope와 Execution context는 다르기 때문에 용어 사용시 주의가 필요합니다.
Execution contexts는 코드가 작동할 때 생성이 되고, lexical scope는 코드가 쓰여진 위치에 의해 정해집니다.
Scope라는 단어로 실행문맥을 표현 하려면, 코드가 쓰여진 위치에 관한 일반적인 Scope에 대해 이야기 할 때에는 'lexical scope', 실행문맥을 이야기 할 때에는 in-memory scope라고 표현하는 것도 둘을 구분하는 좋은 방법인 것 같습니다.
'Lexical environment: where something sits physically in the code you write.