본문 바로가기

Javascript

렉시컬 환경

렉시컬 환경

  • 식별자와 스코프의 실행 컨텍스트 관리
  • 식별자와 식별자에 의해 바인딩된 값
  • 상위 스코프에 대한 참조를 기록하는 자료구조
  • 실행 컨텍스트를 구성하는 컴포넌트
  • 함수가 실행될 때 렉시컬 환경이 구성
  • 렉시컬 환경 환경레코드, 외부렉시컬 환경으로 구성

렉시컬 환경 객체

  • 환경 레코드
    • 모든 지역 변수를 프로퍼티로 저장하고 있는 객체
    • this 값과 같은 기타 정보도 여기에 저장
  • 외부 렉시컬 환경
    • 현재 렉시컬 환경보다 더 상위의 렉시컬 환경

렉시컬 환경
 
function makeCounter() {
  let count = 0;

  return function() {
    return count++;
  };
}

# 중첩된 함수를 여러 번 호출할 때에 하나의 makeCounter() 함수를 외부 렉시컬 환경으로 참조하므로 count가 증가 된 값들이 반영
let counter = makeCounter();
console.log(counter()); // 0
console.log(counter()); // 1
console.log(counter()); // 2
  
# 3개의 고유한 렉시컬 환경(makeCounter)이 만들어지고 중첩된 함수는 각각의 서로 다른 외부 렉시컬 환경(makeCounter)을 참조
console.log(makeConter()()); // 0
console.log(makeConter()()); // 0
console.log(makeConter()()); // 0

변수

  • '변수'는 특수 내부 객체인 환경 레코드의 프로퍼티.
  • 변수를 가져오거나 변경하는 것 =  환경 레코드의 프로퍼티를 가져오거나 변경 함.

함수 선언문

  • 함수 선언문으로 선언한 함수는 일반 변수와 달리 바로 초기화
  • 함수 선언문으로 선언한 함수는 렉시컬 환경이 만들어지는 즉시 사용할 수 있음
  • 렉시컬 환경엔 함수 호출 시 넘겨 받은 매개변수와 함수의 지역 변수가 저장
  • 함수가 호출 중인 동안엔 호출 중인 함수를 위한 내부 렉시컬 환경과 내부 렉시컬 환경이 가리키는 외부 렉시컬 환경을 갖게 됨

내부와 외부 렉시컬 환경

  • 내부 렉시컬 환경은 외부 렉시컬 환경에 대한 참조를 갖고 있음
  • 코드에서 변수에 접근할 땐, 먼저 내부 렉시컬 환경을 검색 범위로
  • 내부 렉시컬 환경에서 원하는 변수를 찾지 못하면 검색 범위를 외부 렉시컬 환경으로 확장 ( 검색 범위가 전역 렉시컬 환경으로 확장될 때까지 반복)
  • 전역 렉시컬 환경에 도달할 때까지 변수를 찾지 못하면 엄격 모드에선 에러가 발생
  • 비 엄격 모드에선 정의되지 않은 변수에 값을 할당하려고 하면 에러가 발생하는 대신 새로운 전역 변수가 만들어지는데, 이는 하위 호환성을 위해 남아있는 기능


[[Environment]] 프로퍼티

  • 호출 장소와 상관없이 함수가 자신이 태어난 곳을 기억
  • [[Environment]]는 함수가 생성될 때 딱 한 번 값이 세팅되고 영원히 변하지 않음
  • 이 렉시컬 환경은 counter.[[Environment]]에 저장된 렉시컬 환경을 외부 렉시컬 환경으로서 참조

실행 컨텍스트 스택: 코드 실행 순서 관리

  • 실행 컨텍스트 스택 최상위에 존재하는 실행 컨텍스트는 언제나 현재 실행중인 코드의 실행 컨텍스트
  • 실행컨텍스트 최상위에 존재하는 실행 컨텍스트 => 실행 중인 실행 컨텍스트

'Javascript' 카테고리의 다른 글

클로저  (0) 2023.01.06
실행 컨텍스트  (0) 2023.01.06
스코프  (0) 2023.01.06
블록레벨스코프와 함수레벨스코프  (0) 2022.07.27
ES6 특징  (0) 2022.07.26