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. 결론

메모리 절약 뿐만 아니라, 성능을 위해서 변수는 최대한 필요한 곳에서 정의 해야 함

 

 

 

 

출처 : https://eyabc.github.io/Doc/dev/core-javascript/%EB%A0%89%EC%8B%9C%EC%BB%AC%20%ED%99%98%EA%B2%BD.html#%EC%A0%84%EC%97%AD-%EB%A0%89%EC%8B%9C%EC%BB%AC-%ED%99%98%EA%B2%BD-global-lexical-environment