자바스크립트 입문_스코프, 스코프체인, outerEnvironmentReference

자바스크립트 2021. 5. 4. 14:50

(본 포스팅은 위키북스의 '코어자바스크립트' 책을 공부하면서 작성되었습니다_내돈내산)

 

  • 스코프(scope) : 식별자에 대한 유효범위. 
  • 스코프체인(score chain) : '식별자의 유효범위(스코프)'를 안에서부터 바깥으로 차례로 검색해 나가는 것. LexicalEnvironment의 outerEnvironmentReference를 이용함.

A 함수내부에 B 선언, B함수 내부에 C 선언

>> 함수 C의 outerEnvironmentReference는 함수 B의 LexicalEnvironment를 참조
>> 함수 B의 outerEnvironmentReference는 함수 A의 LexicalEnvironment를 참조

>>>>> 즉, 함수는 선언될 시점에 저장되어있는 LexicalEnvironment를 outerEnvironmentReference로써 참조함

 

<작동 예시>

var a = 1 ;						// (2)
var outer = function() {		// (3)
	var inner = function() {	// (5)
    	console.log(a);			// (7) 출력값: undefined
        var a = 3 ;				// (8)
	};
    inner();					// (6)
    console.log(a);				// (9) 출력값: 1
};
outer();						// (4)
console.log(a);					// (10) 출력값: 1

위와같은 함수가 있을때 작동하는 순서를 스코프체인에 의거해서 알아보면

  1. 전역컨텍스트 활성화. 전역컨텍스트의 environmentRecord에는 a와 outer 식별자가 저장. 전역컨텍스트에는 선언시점이 없으므로 outerEnvironmentReference에는 아무것도 담기지 않음.

  2. 1,2번째 줄에서 전역스코프의 변수 a에 1을, outer에 함수 할당

  3. outer함수 호출함과 동시에 전역컨텍스트의 코드가 중단되고 outer함수로 넘어감.

  4. outer 실행 컨텍스트의 environmentRecord에 inner 식별자를 저장. outerEnvironmentReference에는 outer함수가 선언될 당시의 LexicalEncironment가 담김(outer함수는 전역공간에서 선언되었으므로, 전역컨텍스트의 LexicalEnvironment를 참조함) [ GLOBAL(실행컨텍스트 이름), { a , outer }(environmentRecord 객체) ]

  5. outer 스코프에 있는 inner 식별자에 함수를 할당함. 

  6. inner함수가 호출되며 함수내부로 접근. 이때 outer 실행컨텍스트의 코드는 중단되고 inner 실행컨텍스트가 활성화되어 inner함수 내부로 이동하게 됨. 

    이때 inner 실행컨텍스트의 environmentRecord에는 { a } 식별자를 저장하고, outerEnvironmentReference에는 inner함수가 선언될 당시의 LexicalEncironment가 담김. [ outer, { inner } ]

  7. 식별자 a에 접근하기 위해 inner 컨텍스트의 environmentRecord에서 a값을 검색(할당작업이 이루어지지 않았으므로 undefined출력) >> inner 컨텍스트에서 a를 찾았지만 할당된 값이 없으므로 undefined 출력(여기서 식별자를 찾지 못하면 다음 스코프로 나가서 찾는다, 만약 안에서도 a가 식별자로 선언되고 밖에서도 선언되어있으면 무조건 안쪽의 a값이 식별자로 인식됨 >> 변수 은닉화(variable shadowing))

  8. inner 스코프의 a 식별자에 3을 할당함. (inner 실행 종료)

  9. 밖으로나와 다시 outer 실행컨텍스트가 활성화됨. 식별자 a에 접근하려고 하고 outer 실행컨텍스트의 environmentRecord에서 a식별자를 찾아감. outer 실행컨텍스트내부에는 a값이 존재하지 않으므로 바로 outerEnvironemntReference인 전역컨텍스트의 LexicalEnviornment에서 a =1 을 찾아 1을 출력하면서 outer 실행컨텍스트가 종료되어 콜스택에서 제거됨.

  10. 마지막줄에서 a값에 접근하기 위해 전역 실행컨텍스트에서 a값을 찾아 1을 출력함.

!! 스코프체인은 안에서 밖으로 이동하기때문에 밖에서 안으로 식별자를 검색해서 들어오는것은 불가능함. !!

admin