자바스크립트 엔진은 코드 실행하기 위해서 아래와 같은 정보가 필요하다.
- 변수 : 전역변수, 지역변수, 매개변수, 객체의 프로퍼티
- 함수 선언
- 스코프 (유효 범위)
- this
Execution Context 종류
실행 컨텍스트의 종류는 전역 컨텍스트, 함수 컨텍스트 두가지가 있다.
전역 컨텍스트는 함수 내부에서 실행되는 코드를 제외하고 모두 전역 컨텍스트로 볼수 있다. 함수 컨텍스트는 함수가 호출이 될 때 생성되고 함수가 동작을 다하게 되면 소멸된다.
Execution Context 3가지 객체
실행 컨텍스트는 실행 가능한 코드를 형상화하고 구분하는 추상적인 개념이지만 객체의 형태로 3가지 프로퍼티를 소유한다.
- 변수 객체(arguments, variable)
- scope chain
- this
아래 코드를 통해서 컨텍스트 종류와 3가지 객체를 살펴보자.
var color = 'black'function bar (text) {
console.log(text + color)
}function foo () {
var color = 'white' bar('color is ')
}foo()
// color is black
전역 컨텍스트
{ // 전역 컨텍스트
'변수 객체': {
arguments: null,
variable: [ 'color', 'bar', 'foo' ]
},
scopeChain: [ '전역 변수 객체' ],
this: window
}
foo 함수 컨텍스트
{ // foo 함수 컨텍스트
'변수 객체': {
arguments: null,
variable: [ 'color' ]
},
scopeChain: [ 'foo 변수 객체', '전역 변수 객체'],
this: window
}
bar 함수 컨텍스트
{ // bar 함수 컨텍스트
'변수 객체': {
arguments: [{ text: 'color is' }],
variable: null
},
scopeChain: [ 'bar 변수 객체', '전역 변수 객체'],
this: window
}
bar()
는 실행된 곳이 아닌 선언된 위치에서 스코프 체인의 값이 결정 된다. bar()
함수 내부에서 color
값을 찾을수 없기에 스코프 체인을 따라 올라가 값을 찾게 되고 전역에 선언된 color
값을 참조하게 된다.