Gapus Dev Blog

[자바스크립트] 클로저 본문

프론트엔드/JavaScript

[자바스크립트] 클로저

Gapus 2023. 10. 28. 14:20
  • 클로저란?
    • 함수와 함수가 선언된 렉시컬 환경의 조합으로 함수가 선언될 당시의 스코프 체인을 기억하고,
      함수가 호출될 때에도 그 스코프 체인을 참조하여 변수에 접근할 수 있게 해준다.
  • 동작 원리
    1. 함수가 선언될 때, 해당 함수의 렉시컬 환경이 생성된다.
      이 렉시컬 환경에는 함수 내부에서 선언된 변수들과 그 값을 담고 있는 스코프 체인이 포함된다.

    2. 클로저는 외부 함수의 변수에 접근할 수 있다. 이는 내부 함수가 외부 함수의 변수를 계속해서 참조할 수 있게 해준다.

    3. 함수가 반환되거나 다른 함수에 전달될 때, 클로저가 형성된다.
  • 예시
function outerFunction() {
  var outerVariable = 'Outer';

  return function innerFunction() {
    console.log(outerVariable);
  }
}

var closure = outerFunction();
closure(); // "Outer" 출력
  • 사용하는 곳
    • 비동기 처리
      • 비동기 콜백 함수 내부에서 외부 변수에 접근해야 할 때 클로저를 활용하여,
        이를 통해 비동기 작업이 완료된 후에도 원하는 변수에 접근 가능하다.
    • 정보 은닉
      • 외부에서 접근하지 않아야 하는 변수를 클로저 내부에 선언하고, 
        클로저를 통해서만 해당 변수에 접근할 수 있도록 제어할 수 있다.
    • 함수 팩토리
      • 함수를 동적으로 생성하는 함수 팩토리를 구현해서
        매번 새로운 클로저를 생성하여 각각의 인스턴스가 독립적인 상태를 유지 할 수 있다.
  • 주의할 점
    • 메모리 관리
      • 클로저는 JS의 가비지 컬렉터에 의해 메모리에서 해제되지 않는 경우가 있습니다.
      • 클로저가 더 이상 필요하지 않은 경우 해당 클로저에 대한 참조를 제거하여 메모리 누수를 방지해야 한다.
      • 이를 위해 변수나 객체 등에 대한 참조를 null로 설정하거나,
        이벤트 핸들러 등록 해제 등의 작업을 수행해야 한다.
    • 성능 고려
      • 클로저를 생성할 때마다 메모리에 새로운 렉시컬 환경이 생성된다.
      • 클로저를 과도하게 사용하면 메모리 사용량이 증가하고 성능이 저하될 수 있다.
    • 비동기 처리시 문제
      • 비동기 콜백 함수 내부에서 외부 변수에 접근하는 경우,
        클로저를 통해 접근하는 변수의 값은 비동기 작업이 완료되기 전까지 변경되지 않는다.
    • 정보 은닉의 잘못된 사용
      • 과도한 정보 은닉은 코드의 가독성을 저하시킬 수 있다.