렉시컬 환경(렉시컬 환경 객체) 이란?
- 코드블록({...}), function, script를 실행하기 앞서 생성되는 특별한 객체
- 실행할 스코프 범위 안에 있는 변수와 함수를 프로퍼티로 저장하는 객체
렉시컬 환경의 구성요소
1. 환경 레코드(Environment Record)
- 모든 지역 변수를 프로퍼티로 저장하고 있는 객체
- this 값과 같은 기타 정보도 여기에 저장
💡 변수는 특수 내부 객체인 환경 레코드의 프로퍼티일 뿐.
변수를 가져오거나 변경하는 것은 환경 레코드의 프로퍼티를 가져오거나 변경함을 의미
1.1 객체 환경 레코드 (Object Environment Record)
- 바인딩 하는 것들
- 전역 객체 -> BindingObject 객체
- with문과 같이 식별자를 어떤 특정 객체의 속성으로 취급할 때 사용
💡 전역 객체의 프로퍼티
- var로 선언한 전역 변수
- 내장 전역 객체들의 바인딩
- 전역 스코프에서의 함수, 비동기 함수, 제너레이터, 비동기 제너레이터
ObjectEnvironmentRecord = {
[[BindingObject]]: 전역 객체 참조
}
1.2 선언 환경 레코드 (Declarative Environment Record)
- 바인딩 하는 것들
- variable
- constant
- let
- class
- module
- import
- 함수 선언
DeclartionEnvironmentRecord = {
a: 33,
b: 'Hello World'
}
2. 외부 렉시컬 환경(Outer Lexical Environment)에 대한 참조
예시
- 네모 상자 → 환경 레코드
- 화살표 → 외부 렉시컬 환경에 대한 참조
- 전역 렉시컬 환경은 외부 참조를 갖지 않기 때문에 화살표가 null을 가리킨다!
렉시컬 스코프(정적 스코프)란?
정의
함수를 어디서 호출하는지가 아니라 어디에 선언하였는지에 따라 상위 스코프를 결정하는 것
예시
- second() 함수는 first() 내부에서 호출되지만,
- 전역으로 선언되었으므로 상위 스코프는 전역 스코프이다.
- 즉 스코프 체인을 통해 x라는 변수를 second()함수 내부에서 찾고 없으니까 → 상위 스코프인 전역 스코프에서 찾는다.
- 전역 스코프의 환경 레코드에서 x를 가져오므로 1이 출력되는 것!
[[Environment]]
정의
- 함수는 [[Environment]]라 불리는 숨김 프로퍼티를 갖는데, 여기에 함수가 선언된 곳의 렉시컬 환경에 대한 참조가 저장된다. (함수의 상위 스코프)
- [[Environment]]는 함수가 생성될 때 딱 한 번 값이 세팅되고 영원히 변하지 않는다.
- 변수의 값의 갱신은 변수가 저장된 렉시컬 환경에서 이루어진다.
예시
- counter.[[Environment]]에는 {count: 0}이 있는 렉시컬 환경에 대한 참조가 저장된다.
- counter()를 호출하면 각 호출마다 새로운 렉시컬 환경이 생성된다.
- 그리고 생성된 렉시컬 환경은 counter.[[Environment]]에 저장된 렉시컬 환경을 외부 렉시컬 환경으로서 참조한다.
'TIL > JavaScript' 카테고리의 다른 글
[240201] 실행 컨텍스트 - (2) (1) | 2024.02.01 |
---|---|
[240130] this (0) | 2024.01.30 |
[240130] 스코프, 스코프 체인, 프로토타입, 프로토타입 체인 (0) | 2024.01.30 |
[240130] 자바스크립트의 객체 생성 방법(객체 리터럴 vs new Object() vs 생성자 함수 vs 클래스) (1) | 2024.01.30 |
[240129] 프로토타입, [[Prototype]] vs __proto__ vs prototype 프로퍼티 (0) | 2024.01.29 |