Closure 개념 정리

2025. 12. 29. 23:42React

반응형

클로저란 무엇인가?

  • 함수가 “자기가 태어난 렉시컬 환경(스코프)”를 기억해서 함수 실행이 끝난 뒤에도 그 변수를 계속 사용하는 것

렉시컬 환경이란?

  • 환경 레코드(Environment Record)
    • 모든 지역 변수를 프로퍼티로 저장하고 있는 객체
    • this 값과 같은 기타 정보도 여기에 저장
  • 외부 렉시컬 환경(Outer Lexical Environment) 에 대한 참조 – 외부 코드와 연관됨
Lexical Environment
{
  Environment Record: { 변수들 }
  Outer Environment Reference: 바깥 환경
}
  • 함수는 자기 몸체가 정의된 위치 기준으로 환경을 기억함
  • 이 정보가 함수의 내부 슬롯 [[Environment]]에 저장됨

클로저 예시 함수

function makeCounter() {
  let count = 0;

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

const counter = makeCounter();
  • counter는 makeCounter() 가 끝나도 count 값을 계속 기억함

일반 함수 vs 클로저

일반함수

function counter() {
  let count = 0;
  count++;
  return count;
}

counter(); // 1
counter(); // 1

호출 → 환경 생성 → 실행 → 종료 → 환경 파괴

왜 항상 1인가?

  • 호출할 때마다 새 렉시컬 환경 생성
  • count = 0 매번 다시 생성
  • 함수 끝나면 환경 즉시 소멸

클로저

function makeCounter() {
  let count = 0;

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

const counter = makeCounter();
counter(); // 1
counter(); // 2
counter(); // 3

makeCounter 실행
→ 렉시컬 환경 생성
→ 내부 함수가 [[Environment]]로 참조
→ makeCounter 종료
→ 환경 유지됨

왜 누적되는가?

  • count는 makeCounter의 렉시컬 환경에 있음
  • 내부 함수가 그 환경을 참조
  • 참조가 살아있는 동안 환경 소멸 ❌
    • counter = null; // ← 이 순간 GC 대상

“중첩 함수면 다 클로저냐?”

function outer() {
  let x = 0;

  function inner() {
    x++;
  }

  inner();
}

클로저 아님

  • inner가 밖으로 안 나감
  • outer 끝나면 전부 소멸

클로저가 성립하는 정확한 조건

  • 함수 안에서 함수 만들어지고
  • 내부 함수가 외부 변수를 참조하고
  • 그 내부 함수가 살아남을 때

질문

counter  = makeCounter();
counter2 = makeCounter();

각각 독립적인 참조를 가질 것인가?

  • 각 변수는 새 렉시컬 환경을 할당 받아 사용함
  • 함수 코드 내용은 같아도
  • 참조하는 렉시컬 환경은 다르다
  • 호출될 때마다 환경은 새로 만들어짐

언제 같은 참조가 되냐면?

const counter = makeCounter();
const counter2 = counter;

counter  → function → count
counter2 ↗
  • 같은 함수 객체를 가리키는 것이라 count 공유됨
반응형