Closure

Eloe·2023년 5월 28일

daybydaby

목록 보기
2/3

1.클로저란?

생명주기가 종료된 외부함수의 변수를 참조할 수 있는 중첩함수

2. 클로저의 조건

(자바스크립트의 모든 함수는 상위스코프를 기억하므로 이론적으로 모든 함수는 클로저)
(그러나 일반적으로)
1. 중첩함수가 외부함수보다 더 오래 유지되며
2. 중첩함수가 외부함수의 변수를 참조하고 있을때.

클로저라고 한다.

3. 예시

const x = 1; //전역변수

function outer() {
  //지역변수
  const x = 10;
  
  const inner = function () {
    console.log(x);
  };
  return inner;
}
//outer의 lifeCycle은 inner을 반환하면서 종료됨

const innerFunc = outer();
//이미 생명주기가 종료된 outer함수의 변수 x를 참조하고있다.
//이는 inner에서 자신의 [[environment]] 슬롯에 자신이 정의된 outer함수의 렉시컬환경을 값을 저장한다.
//outer함수의 렉시컬 환경은 inner에 의해 참조되고 있기 때문에 사라지지않는다.
//*)js의 가비지 컬렉터는 누군가가 참조하고 있는 메모리 공간을 함부로 해제 x 

innerFunc(); //10

4. 렉시컬 환경(Lexical Environment)

  • 실행컨텍스트를 구성하는 컴포넌트이자 자료구조
  • 식별자와(x), 식별자에 바인딩된 값(x=10), 상위스코프에 대한 참조(outer)를 기록한다.

렉시컬환경의 구성

1) 환경레코드 (EnvironmentRecord) 
	스코프에 포함된 식별자를 등록하고, 등록된 식별자에 바인딩 된 값을 관리하는 저장소
2) 외부 렉시컬 환경에 대한 참조 (Outer Lexical Environment Reference)
	해당 실행컨텍스트를 생성한 상위 코드의 렉시컬 환경을 의미한다.
    외부 렉시컬환경에 대한 참조를 통해 스코프체인을 구혈할 수 있다.
profile
황새를 쫓는 뱁새를 좋아합니다.

0개의 댓글