Study/JavaScript

[JavaScript_study] 렉시컬 환경(Lexical Environment)

갈푸라떼 2022. 4. 14. 02:58

* 실행 컨텍스트(Execution Context)

  • 코드의 실행 순서와 스코프를 기억
  • 자바스크립트 런타임안에 Call Stack이 있는데 Call Stack를 통해서 하나하나씩 코드의 실행순서를 기억한다.
  • 자바스크립트는 단 하나의 싱글 컨텍스트 스택이 있다.
    • 한번에 하나의 일만 처리 할 수 있다.


* 어떻게 블럭안에 데이터가 있는지 없는지 확인하고 그리고 근접한 부모의 스코프를 찾는걸까???

  • 이유는 각각의 블록은 렉시컬 환경(Lexical Environtment)라는 내부 오브젝트를 가지고 있다.
  • 그래서 각각 블럭 마다 어떤 변수들이 들어있는지 부모는 누구인지에 대한 정보를 가지고있는 오브젝트가 있다.
  • 실행순서와 각각의 블럭에 대한 정보들을 한 오브젝트안에 데이터를 담아둔다.

* 렉시컬 환경 내부

  • 환경 레코드(Environment Record) : 현재 블럭의 해당하는 정보를 담고있는 환경 레코드
  • 외부 환경 참조(Outer Lexical Environment Reference) : 부모는 누구인지 부모를 참조하고 있는 외부 환경 참조

* 실행 컨텍스트 스택

  • 코드가 실행이 되면 전역스코프 렉시컬 환경이 만들어진다. // 외부 렉시컬 환경 참조 : null
  • 이후 블럭1 렉시컬 환경이 만들어진다. // 외부 렉시컬 환경 참조 : 전역 렉시컬 환경(부모)
  • 이렇게 스코프들이 연결되어 있는것을 스코프 체인이라고 한다.
  • 블럭이 모두 끝나게 되면 하나하나씩 스택에서 빠지고 전역이 다 끝나야 스택이 텅텅비어진다.
  • 메모리 절약 뿐만 아니라, 성능을 위해서라도 변수는 최대한 필요한 곳에서 정의해야 한다.
    • 중첩된 스코프나 중첩된 함수가 있다면 스코프 체인을 따라서 계속 확인을 하기 때문에 성능이 저하된다.


* 스코프란?

  • 식별자가 유효한 범위
  • 스코프 외부에서는 스코프 내부에 있는거에 대해서 접근할 수 없지만 스코프 내부에서는 외부에 있는 그 어떤 부모의 데이터도 접근할 수 있다.
  • 이렇게 접근할 수 있는 이유는 각각의 스코프는 렉시컬 환경이란것이 있는데 그안에 외부 렉시컬 환경 참조를 통해서 스코프 체인을 통해서 찾아가면서 부모의 데이터에 접근할 수 있기 때문이다.

 


* 실행 컨텍스트(Execution Context)예시코드

  • 코드의 실행 순서와 스코프를 기억!
  • 각각의 블럭은 렉시컬 환경(Lexical Environtment)을 가지고 있다.
  • 렉시컬 환경(Lexical Environtment)내부에는 1. 환경 레코드(Environment Record) 2. 외부 환경 참조(Outer Lexical Environment Reference)이 있다.
// 전역스코프
const a = 1; 
{
  // 블럭1스코프
  const a = 2;
  {
    // 블럭2스코프
    const a =3;
  }
}