Javascript
Javascript - 렉시컬 환경(Lexical Environment)
개발따라김양
2022. 11. 7. 20:04
1. 렉시컬 환경
- 스크립트 전체, 실행중인 함수, 코드블록 등은 자신만의 렉시컬 환경을 갖음.
- 환경레코드, 외부렉시컬 환경으로 구성
2. 환경레코드(Environment Record)
- 현재 블럭에 해당하는 정보를 담고 있음
- 렉시컬 환경에서 모든 지역변수를 프로퍼티로 저장하고 있는 객체
- this, 함수일 경우 매개변수도 포함
- 변수는 특수 내부 객체인 환경 레코드의 프로퍼티일 뿐
- 변수를 가져오거나 변경하는 것 = 환경 레코드의 프로퍼티를 가져오거나 변경하는 것
3. 외부렉시컬 환경(Outer Lexical Environment)
- 현재 렉시컬 환경보다 더 상위의 렉시컬 환경
- 부모 블럭을 참조하는 정보를 담고 있음
- 따라서 블럭 밖에서 안의 변수에는 접근하지 못하지만
블럭 안에서 블럭 밖의 변수에는 접근 가능 - 외부 렉시컬 환경을 참조하는 과정
- 렉시컬 환경이 만들어질 때 Environment라는 숨김 프로퍼티가 만들어진다.
- 지역내에서 참조할 값이 없을 경우 프로퍼티에 접근하여 외부 렉시컬 환경을 참조하게되는데
값이 없을 경우 최상위 렉시컬 환경까지 검색하게 되는 체이닝 과정이 일어난다.
- 성능 저하가 일어날 수 있음
4. 코드와 함께 보기
let dog1 = "rive"
//렉시컬 환경 : dog1:"rive"
//외부 렉시컬 환경 참조 : null => 전역 렉시컬 환경은 외부 참조를 갖지 않는다
let dog = "rive"; // -> A
{ // -> B
{
console.log(dog) // -> C
}
}
// C의 외부 렉시컬 환경은 B
// B의 외부 렉시컬 환경은 A
// C -> B -> A 는 스코프 체인으로 연결되어 있음
// 따라서 C에서 A의 값을 참조할 수 있음!
3. 결론
메모리 절약 뿐만 아니라, 성능을 위해서 변수는 최대한 필요한 곳에서 정의 해야 함