Scope
JavaScriptScope?
Scope(스코프)란 식별자에 대한 유효범위이다.
어떤 경계 A의 외부에서 선언한 변수는 A의 외부 뿐 아니라 A의 내부에서도 접근이 가능하지만, A의 내부에서 선언한 변수는 오직 A의 내부에서만 접근할 수 있다.
ES5까지의 자바스크립트는 전역공간을 제외하면 오직 함수에 의해서만 스코프가 생성되고, ES6에서는 블록에 의해서도 스코프 경계가 발생하면서 다른 언어와 스코프 개념이 비슷해졌다.
스코프(식별자의 유효범위)를 안에서부터 바깥으로 차례로 검색해나가는 것을 Scope Chain(스코프 체인) 이라고 부르는데, LexicalEnvironment
의 두 번째 수집자료인 outerEnvironmentReference
를 사용한다.
1
2
3
4
5
6
7
8
9
10
11
var a = 1;
var outer = function(){
var inner = function(){
console.log(a); // undefined
var a = 3;
};
inner();
console.log(a); // 1
};
outer();
console.log(a); // 1
- 시작 : 전역 컨텍스트 활성화
- 전역 컨텍스트의
environmentRecord
에{a, outer}
식별자를 저장한다.
- 전역 컨텍스트의
- 1번째 줄과 2번째 줄 : 전역 스코프에 있는 변수
a
에 1을,outer
에 함수를 할당한다. - 10번째 줄 :
outer
함수를 호출한다.- 전역 컨텍스트의 코드는 10번째 줄에서 임시중단되고,
outer
실행 컨텍스트가 활성화되어 2번째 줄로 이동한다.
- 전역 컨텍스트의 코드는 10번째 줄에서 임시중단되고,
- 2번째 줄 :
outer
실행 컨텍스트의environmentRecord
에{inner}
식별자를 저장한다.outerEnvironmentReference
에는outer
함수가 선언될 당시의LexicalEnvironment
가 담긴다. - 3번째 줄 :
outer
스코프에 있는 변수inner
에 함수를 할당한다. - 7번째 줄 :
inner
함수를 호출한다.outer
실행 컨텍스트의 코드는 7번째 줄에서 임시중단되고inner
실행 컨텍스트가 활성화되어 3번째 줄로 이동한다.
- 3번째 줄 :
inner
실행 컨텍스트의environmentRecord
에{a}
식별자를 저장한다.outerEnvironmentReference
에는inner
함수가 선언될 당시의LexicalEnvironment
가 담긴다.inner
함수는outer
함수 내부에서 선언됐으므로outer
함수의LexicalEnvironment
, 즉[{outer, inner}]
를 참조복사한다. -
4번째 줄 : 식별자
a
에게 접근한다. 현재 활성화 상태인inner
컨텍스트의environmentRecord
에서a
를 검색한다.a
가 발견되지만 아직 할당된 값이 없다.undefined 출력
- 5번째 줄 :
inner
스코프에 있는 변수a
에 3을 할당한다. - 6번째 줄 :
inner
함수 실행이 종료된다.inner
실행 컨텍스트가 콜 스택에서 제거되고, 바로 아래의outer
실행 컨텍스트가 다시 활성화되면서, 앞서 중단됐던 7번째 줄의 다음으로 이동한다. -
8번째 줄 : 식별자
a
에 접근하고자 한다. 자바스크립트 엔진은 활성화된 실행 컨텍스트의LexicalEnvironment
에 접근한다. 첫 요소의environmentRecord
에서a
가 있는지 찾아보고, 없으면outerEnvironmentReference
에 있는environmentRecord
로 넘어가는 식으로 계속해서 검색한다. 두 번째, 즉 전역LexicalEnvironment
에a
가 있으니 그a
에 저장된 값1
을 반환한다.1 출력
- 9번째 줄 :
outer
함수 실행이 종료된다.outer
실행 컨텍스트가 콜 스택에서 제거되고, 바로 아래의 전역 컨텍스트가 다시 활성화되면서, 앞서 중단됐던 10번째 줄의 다음으로 이동한다. -
10번째 줄 : 식별자
a
에 접근하고자 한다. 현재 활성화 상태인 전역 컨텍스트의environmentRecord
에서a
를 검색한다. 바로a
를 찾을 수 있다.1 출력
- 모든 코드의 실행이 완료된다. 전역 컨텍스트가 콜 스택에서 제거되고 종료된다.
출처
JavaScript: The Hard Parts (Will Sentance)
코어 자바스크립트 (정재남)