실행컨텍스트의 내부.
실행컨텍스트에는 세 가지 환경 정보들이 담김. VariableEnvironment, LexicalEnvironment, ThisBinding. 이중 VariableEnvironment과 LexicalEnvironment에는 현재 환경과 관련된 식별자 정보들이 담김. VariableEnvironment에는 식별자 정보 수집용도로만 쓰이고, LexicalEnvironment는 각 식별자에 담긴 데이터를 추적하는 용도로 쓰임. 컨텍스트 내부 코드 실행 간 변수의 값이 변경되면 LexicalEnvironment에만 실시간으로 반영. 즉 VariableEnvironment과 LexicalEnvironment에는 실시간성의 차이만 있음. 일반적으로 LexicalEnvironment위주로 관찰해도 문제될 것이 없으므로 여기에 포커스를 맞춤.
LexicalEnvironment는 어휘적/사전적 환경임.
LexicalEnvironment는 어떤 실행 컨텍스트 A에 대한 환경정보가 담겨 있는 사전임. 실행컨텍스트를 구성하는 환경 정보들을 모아 사전처럼 구성한 객체. 이를 파악하고 나면 LexicalEnvironment를 구성하는 environmentRecord와 outerEnvironmentReference가 좀 더 와닿음.
실행컨텍스트가 처음 생성되는 순간에 가장 먼저 하는 것이 environmentRecord에 선언된 식별자들을 수집하는 것임. 이 때문에 호이스팅 현상이 발생함. 호이스팅은 끌어올리다 라는 뜻인데, 식별자 정보를 실행컨텍스트의 맨 위로 끌어올린다는 것. 호이스팅은 실제하는 현상은 아니지만 environmentRecord의 수집과정을 쉽게 이해하기 위해 만든 허구의 개념인 것.
좌측 코드의 호이스팅 결과를 정리하면 우측 코드와 같음. 이중 호이스팅에 의해 끌어올려진 내용 전체가 environmentRecord임.(function의 경우 내용 전체가 호이스팅 됨.)
좌측의 environmentRecord는 실제로 일어난 것이고, 우측 코드는 이해를 돕기위한 가상의 코드임. 우측과 같이 이해해도 문제될 것은 없음.
외부 환경에 대한 참조. 외부의 LexcialEnvironment를 말함. 현재 문맥과 관련있는 외부 컨텍스트의 식별자 정보를 참조.
outerEnvironmentReference가 관여하는 것이 스코프체인임. 스코프체인 현상이 outerEnvironmentReference에 의해 만들어지는 것.
스코프는 변수의 유효범위인데, 사실 실행 컨텍스트에 의해 만들어짐. 실행컨텍스트가 수집해놓은 정보만 접근을 활 수 있고, 그 변수는 실행컨텍스트 내부에만 존재하는 것.
inner에서 어떤 변수를 찾으라는 명령을 하면 일단 inner의 environmentRecord에서 찾고, 없으면 outerEnvironmentReference를 타고 outer의 environmentRecord에서 찾고, 없으면 outerEnvironmentReference를 타고 전역의 environmentRecord에서 찾게됨. 이것이 스코프체인임. 가장 가까운 자기자신부터 멀리있는 스코프로 찾아나가는 것. 이렇게 가장 먼저 찾아진 것만 접근할 수 있는 개념을 쉐도잉(shadowing)이라고 함.
excution context(실행컨텍스트)는 함수를 실행할 때 필요한 환경정보를 담은 객체.
실행컨텍스트안에는 variable environment와 lexical environment가 있음.
variable environment는 최초에 식별자 정보를 들고있지만 값이 변하지 않음.
lexical environment는 값이 트래킹됨.
environmentRecord(현재문맥의 식별자)와 outerEnvironmentReference(외부 식별자)를 수집한 것이 LexicalEnvironment.
environmentRecord에 의해서 호이스팅이 발생하고, outerEnvironmentReference에 의해 스코프체인 개념이 발생.
this에 대해서는 다음 시간에.