# 렉시컬 환경(Lexical Environment)
= 내부 숨김 연관 객체(Internal Hidden Associated Object)
Q: 렉시컬 이름인 이유? "사전의" "어휘의"
- 실행중인 함수
- 코드 블록 {...}
- 스크립트 전체
는 내부 숨김 연관 객체를 갖는다.
# 렉시컬 환경 객체의 구성
# 1. 환경 레코드(Environment Record)
- 모든 지역변수를 프로퍼티로 저장하고 있는 객체
- this 값과 같은 기타 정보도 저장된다.
- 변수는 특수 내부 객체인 환경 레코드의 프로퍼티일 뿐이다.
- 변수를 가져오거나 변경하는 것 = 환경 레코드의 프로퍼티를 가져오거나 변경하는 것.
# 2. 외부 렉시컬 환경(Outer Lexical Environment)에 대한 참조
- 외부 코드(외부 렉시컬 환경)와 연결됨.
# 전역 렉시컬 환경(Global Lexical Environment)
스크립트 전체와 관련된 렉시컬 환경
let phrase = 'hello';
- lexical environment :
phrase: 'hello'
- outer Lexical Environment 참조:
null
- 전역 렉시컬 환경은 외부 참조를 갖지 않는다.
# let 변수의 렉시컬 환경
Lexical Environment outer Lexical Env
1. execution ------------> phrase: <uninitialized>
2. let phrase -----------> phrase: undefined
3. phrase = 'hello' -----> phrase: 'hello' ---> null
4. phrase = 'bye' -------> phrase: 'bye'
1
2
3
4
5
2
3
4
5
스크립트가 시작
- 스크립트 내 선언된 변수 전체가 렉시컬 환경에 올라간다.
- 변수의 상태는 특수 내부상태(Special Internal State)인 'uninitialized'
- JS 엔진은 uninitialized 상태의 변수를 인지하지만, let 을 만나기 전까지는 이 변수를 참조할 수 없다.
렉시컬 환경은 명세서에만 존재한다.
- 자바스크립트가 어떻게 동작하는지 설명하는데 쓰이는 이론상의 객체
- 코드를 사용해 직접 렉시컬 환경을 얻거나 조작하는 것은 불가능
# 함수 선언문의 렉시컬 환경
- 일반 변수와는 달리 바로 초기화 된다.
- 렉시컬 환경이 만들어지는 즉시 사용 가능
- 선언 되기전에도 함수를 사용할 수 있는 이유.
Lexical Environment
execution start --------> phrase: <uninitialized>
say: function
let phrase = 'hello' ...
function say(name) { ...
alert(...) ...
}
1
2
3
4
5
6
7
2
3
4
5
6
7
# 내부와 외부 렉시컬 환경
함수를 호출
해 실행하면 새로운 렉시컬 환경
이 자동으로 만들어 진다.
매개변수
- 함수의
지역변수
let phrase = 'hello';
Lexical Environment outer Lexical Environment
function say(name) { ---
alert(`${phrase}`, ${name}`); |- name: "John" --------> say: function --------> null
} --- phrase: 'hello'
say('John');
1
2
3
4
5
6
7
2
3
4
5
6
7
함수가 호출중인 동안, 호출중인 함수를 위한 렉시컬 환경 2가지
- 내부 렉시컬 환경
- 내부 렉시컬 환경이 가리키는 외부(전역) 렉시컬 환경
# 더 보면 좋은글
# Reference
- KoJavaScriptInfo