본문 바로가기
개인공부/JavaScript

스코프, 스코프 체인, outerEnvironmentReference

by 왕큰새 2020. 8. 3.
728x90

스코프(scope)란, 식별자에 대한 유효범위이다.

어떤 경계 A의 외부에서 선언한 변수는 A의 외부뿐 아니라, A의 내부 에서도 접근이 가능하지만, 

A의 내부에서 선언한 변수는 오직 A의 내부에서만 접근할 수 있다. 

이러한 스코프의 개념은 대부분의 언어에 존재한다. 자바스크립트도 예외가 아닌데, 

es5 까지의 자바스크립트는 특이하게 전역공간을 제외하면 오직 함수에 의해서만 스코프가 생성됬다고 한다.

 

이러한 '식별자의 유효범위'를 안에서 바깥으로 차례로 검색해나가는 것을 스코프 체인(Scope chain)이라 한다.

그리고 이를 가능케 하는 것이 바로 LexicalEnvironment의 두 번째 수집 자료인 outerEnvironmnetReference 이다.

 

ES6에서는 블록에 의해서도 스코프 경계가 발생하게 함으로써 다른 언어와 비슷해졌다. 다만 이러한 블록은 var로 선언한 변수에 대해서는 작용하지 않고, 오직 새로 생긴 let과 const, class, strict mode에서의 함수 선언 등에 대해서만 범위로서의 역할을 수행한다. ES6에서는 둘을 구분하기 위해 함수 스코프, 블록 스코프라는 용어를 사용한다고 한다.

스코프 체인

outerEnvironmentReference는 현재 호출된 함수가 선언될 당시의 LexicalEnvironment를 참조한다.

과거 시점인 '선언될 당시'에 주목하자. '선언하다' 라는 행위가 실제로 일어날 수 있는 시점이란

콜 스택 상에서 어떤 실행 컨텍스트가 활성화된 상태일 때뿐이다. 어떤 함수를 선언(정의)하는 행위 자체도 하나의 

코드에 지나지 않으며, 모든 코드는 실행 컨텍스트가 활성화 상태일 때 실행되기 때문이다.

 

예를 들어, A 함수 내부에 B 함수를 선언하고 다시 B 함수 내부에 C 함수를 선언한 경우, 함수 C의 outerEnvironmentReference는 함수 B의 LexicalEnvironment를 참조한다. 함수 B의 LexicalEnvironment에 있는 outerEnvironmentReference는 다시 함수 B가 선언되던 때(A)의 LexicalEnvironment를 참조하게 된다. 이처럼 outerEnvironmentReference는 연결리스트(linked list)형태를 띈다. '선언 시점의 LexicalEnvironment를 계속 찾아 올라가면 마지막엔 전역 컨텍스트의 LexicalEnvironment가 있을 것이다. 또한 각 outerEnvironmentReference는 오직 자신이 선언된 시점의 LexicalEnvironment만 참조하고 있으므로 가장 가까운 요소부터 차례대로만 접근할 수 있고, 다른 순서로 접근 하는 것을 불가능할 것 이다. 이런 구조적 특성 덕분에, 여러 스코프에서 동일한 식별자를 선언한 경우에는, 

무조건 스코프 체인 상에서 가장 먼저 발견된 식별자에만 접근 가능하게 되는 것이다.

'개인공부 > JavaScript' 카테고리의 다른 글

Window 객체  (0) 2020.08.11
String Method 로 간단한 함수 만들기  (0) 2020.08.07
함수 선언문과 함수 표현식  (0) 2020.08.03
hoisting(호이스팅)  (0) 2020.08.03
실행 컨텍스트(execution context)  (0) 2020.08.03