YJ Blog
JavaScript

자바스크립트 클로저 완전 정복

0회 조회

자바스크립트 클로저 완전 정복

클로저(Closure)는 자바스크립트에서 가장 중요하고 강력한 개념 중 하나입니다.

클로저란?

클로저는 함수와 그 함수가 선언된 렉시컬 환경의 조합입니다.

function outer() {
  const message = 'Hello, Closure!'

  function inner() {
    console.log(message) // 외부 함수의 변수에 접근
  }

  return inner
}

const greet = outer()
greet() // "Hello, Closure!"

왜 클로저가 만들어지는가?

자바스크립트 엔진은 함수를 생성할 때, 그 함수가 선언된 스코프의 참조를 함수 객체에 저장합니다.

개념 설명
렉시컬 스코프 함수가 정의된 위치 기준으로 스코프 결정
실행 컨텍스트 함수가 호출될 때 생성되는 환경
클로저 외부 함수가 종료된 후에도 내부 함수가 외부 변수에 접근 가능

실전 활용 예시

1. 데이터 캡슐화

function createCounter() {
  let count = 0

  return {
    increment() { count++ },
    decrement() { count-- },
    value() { return count },
  }
}

const counter = createCounter()
counter.increment()
counter.increment()
console.log(counter.value()) // 2

2. 함수 팩토리

function multiply(factor) {
  return (number) => number * factor
}

const double = multiply(2)
const triple = multiply(3)

console.log(double(5)) // 10
console.log(triple(5)) // 15

주의사항

반복문에서 클로저를 잘못 사용하면 의도치 않은 동작이 발생할 수 있습니다.

// 잘못된 예 (var 사용)
for (var i = 0; i < 3; i++) {
  setTimeout(() => console.log(i), 1000) // 3, 3, 3
}

// 올바른 예 (let 사용)
for (let i = 0; i < 3; i++) {
  setTimeout(() => console.log(i), 1000) // 0, 1, 2
}

정리

클로저는 자바스크립트의 핵심 메커니즘으로, 데이터 은닉, 팩토리 패턴, 메모이제이션 등 다양한 패턴의 기반이 됩니다.