프론트엔드 개발 블로그

클로저에 대해

by heeji_

클로저의 정의

주변 상태(어휘적 환경)에 대한 참조와 함께 묶인(포함된) 함수의 조합 - mdn

  • 생성된 당시의 스코프체인을 기억하는 함수
  • 함수가 선언될 때의 렉시컬 환경을 기억하는 함수

 

클로저의 이해

function makeFunc() {
  const name = "Mozilla";
  function displayName() {
    console.log(name);
  }
  return displayName;
}

const myFunc = makeFunc();
myFunc();

함수만 봐서는 리턴된 displayName에서는 name이라는게 없기 때문에 에러가 날 것 같이 생겼다. 하지만 클로저가 형성되어 name 변수에 대한 데이터를 가지고 있기 때문에 에러가 나지 않는다. name이 있는 어휘적 환경에 대한 참조를 유지한다고 말할 수 있다.

 

클로저의 사용

클로저는 어떤 데이터와 그 데이터를 조작하는 함수를 연결시켜주어 유용하게 사용할 수 있다.

 

1. 캡슐화

  • 클로저를 사용해 중요한 값을 내부로 숨기고 제어 가능한 인터페이스를 제공할 수 있다.

 

객체 지향 기반 언어에서는 비공개 메서드 (private method)라는 게 있다. 이 메서드는 같은 클래스 내부의 다른 메서드에서만 그 메서드들을 호출할 수 있다. 자바스크립트에 class가 도입되기 전에 비공개 메서드 개념을 구현하기 위해 클로저를 사용했다고 한다.

function counter() {
  let count = 0;

  return {
    increment: function () {
      count += 1;
    },
    print: function () {
      return count;
    },
  };
}

const module = counter();
module.increment();
console.log(module.print());

이게 그 예시이다. increment, print에서 참조하는 count를 기억하고 있다. 그리고 counter로 생성한 module에서는 count에 바로 접근할 수 없고 마음대로 조작할 수 없도록 보호되어있다.

 

2. 메모이제이션

function memoize() {
  const cache = {};

  return (url) => {
    if (cache[url]) {
      console.log(`cached: ${url}`);
      return cache[url];
    } else {
      console.log("호출");
      cache[url] = "response";
    }
  };
}

const memoizedFetch = memoize();

memoizedFetch(
  "[https://pokeapi.co/api/v2/pokemon/1/](https://pokeapi.co/api/v2/pokemon/1/)"
);
memoizedFetch(
  "[https://pokeapi.co/api/v2/pokemon/2/](https://pokeapi.co/api/v2/pokemon/2/)"
);
memoizedFetch(
  "[https://pokeapi.co/api/v2/pokemon/2/](https://pokeapi.co/api/v2/pokemon/2/)"
);
  • 객체 cache를 두고 매개변수로 받은 url에 따라 캐시를 가져오거나 새로 데이터를 불러와 캐시에 저장하는 로직 작성이 가능하다.

 

3. 함수형 프로그래밍

  • 함수형 프로그래밍에서 등장하는 대표적인 개념 중 하나가 커링이다. 커링은 여러 개의 인자를 받는 함수를 하나의 인자만 받는 함수로 나눠서 순차적으로 호출될 수 있게 체인 형태로 구성한 것이다.
function add(a) {
  return (b) => {
    return a + b;
  };
}

const add10 = add(10);

console.log(add10(5)); // 15

 

참고자료

'공부기록 > JavaScript' 카테고리의 다른 글

스코프와 스코프체인  (0) 2024.03.22
프로토타입과 클래스  (1) 2024.03.22
일급함수 & 콜백함수, 고차함수  (0) 2024.03.22
이벤트 루프란?  (0) 2024.03.22
자바스크립트에서 비동기 프로그래밍  (0) 2024.03.22

블로그의 정보

아자아자

heeji_

활동하기