자바스크립트 입문_스코프, 스코프체인, 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
위와같은 함수가 있을때 작동하는 순서를 스코프체인에 의거해서 알아보면
- 전역컨텍스트 활성화. 전역컨텍스트의 environmentRecord에는 a와 outer 식별자가 저장. 전역컨텍스트에는 선언시점이 없으므로 outerEnvironmentReference에는 아무것도 담기지 않음.
- 1,2번째 줄에서 전역스코프의 변수 a에 1을, outer에 함수 할당
- outer함수 호출함과 동시에 전역컨텍스트의 코드가 중단되고 outer함수로 넘어감.
- outer 실행 컨텍스트의 environmentRecord에 inner 식별자를 저장. outerEnvironmentReference에는 outer함수가 선언될 당시의 LexicalEncironment가 담김(outer함수는 전역공간에서 선언되었으므로, 전역컨텍스트의 LexicalEnvironment를 참조함) [ GLOBAL(실행컨텍스트 이름), { a , outer }(environmentRecord 객체) ]
- outer 스코프에 있는 inner 식별자에 함수를 할당함.
- inner함수가 호출되며 함수내부로 접근. 이때 outer 실행컨텍스트의 코드는 중단되고 inner 실행컨텍스트가 활성화되어 inner함수 내부로 이동하게 됨.
이때 inner 실행컨텍스트의 environmentRecord에는 { a } 식별자를 저장하고, outerEnvironmentReference에는 inner함수가 선언될 당시의 LexicalEncironment가 담김. [ outer, { inner } ] - 식별자 a에 접근하기 위해 inner 컨텍스트의 environmentRecord에서 a값을 검색(할당작업이 이루어지지 않았으므로 undefined출력) >> inner 컨텍스트에서 a를 찾았지만 할당된 값이 없으므로 undefined 출력(여기서 식별자를 찾지 못하면 다음 스코프로 나가서 찾는다, 만약 안에서도 a가 식별자로 선언되고 밖에서도 선언되어있으면 무조건 안쪽의 a값이 식별자로 인식됨 >> 변수 은닉화(variable shadowing))
- inner 스코프의 a 식별자에 3을 할당함. (inner 실행 종료)
- 밖으로나와 다시 outer 실행컨텍스트가 활성화됨. 식별자 a에 접근하려고 하고 outer 실행컨텍스트의 environmentRecord에서 a식별자를 찾아감. outer 실행컨텍스트내부에는 a값이 존재하지 않으므로 바로 outerEnvironemntReference인 전역컨텍스트의 LexicalEnviornment에서 a =1 을 찾아 1을 출력하면서 outer 실행컨텍스트가 종료되어 콜스택에서 제거됨.
- 마지막줄에서 a값에 접근하기 위해 전역 실행컨텍스트에서 a값을 찾아 1을 출력함.
!! 스코프체인은 안에서 밖으로 이동하기때문에 밖에서 안으로 식별자를 검색해서 들어오는것은 불가능함. !!
'자바스크립트' 카테고리의 다른 글
자바스크립트 입문_명시적 this 바인딩(call, apply 메소드) (0) | 2021.05.05 |
---|---|
자바스크립트 입문_this (여러가지 상황에 따른) (0) | 2021.05.04 |
자바스크립트 입문_함수 선언문과 함수 표현식 (0) | 2021.05.04 |
자바스크립트 입문_LexicalEnvironment, 호이스팅(hoisting) (0) | 2021.05.04 |
자바스크립트 입문_스택(stack)과 큐(queue)(실행컨텍스트) (0) | 2021.05.03 |