본문 바로가기
Frontend

클로저

by dug_developer 2022. 6. 19.
반응형

클로저(Closures)

우리가 함수 안에서 또 다른 함수를 만들 때마다 사실 우리는 클로저를 만든겁니다.

안쪽 함수가 클로져입니다.

 

🔥 어떠한 함수 안에 내부 함수를 정의한다면, 이 함수는 클로저라고 불릴 수 있습니다. 내부함수의 범위에서는 외부 함수 범위에 있는 변수에 접근이 가능하지만 그 반대는 실현이 불가능하다는 개념이다.

 

실행컨텍스트, 스코프 체이닝, 렉시컬 스코핑와 관련됨!

function outerFunction () {
	const outer = `I see the outer variable!`;

    function innerFunction () {
    	console.log(outer);
    }

  	return innerFunction;
}

outerFunction()(); // I see the outer variable!
  • 클로저는 바깥 함수의 변수에 접근할 수 있기 때문에 주로 두가지 이유로 쓰인다.(주: 사이드 이펙트란 어떤 함수 내에서 자신의 스코프가 아닌 변수들을 제어하는 것을 말합니다.)
    • 1. 사이드 이펙트(side effects)를 제어하기 위해서
    • 2. private 변수를 만들기 위해서

 

예제) 케이크의 맛 정하고 만들기

  • 우리는 케이크의 맛을 안 뒤에 바로 만들고 싶지는 않다
  • 시기가 적절할 때 만들고 싶다는 것입니다.
  • 이 문제를 해결하기 위해, 우리는 우리의 맛을 저장할 수 있는 prepareCake 함수를 작성할 수 있습니다.
  • 그 후 prepareCake 내부에 makeCake 클로져를 반환할 수 있습니다.

지금부터 우리가 원할 때마다 반환된 함수를 1초 안에 불러올 수 있습니다.

function prepareCake (flavor) {
  return function () {
    setTimeout(_ => console.log(`Made a ${flavor} cake!`), 1000);
  }
}

// 맛먼저 설정해 놓기
const makeCakeLater = prepareCake('banana!');

// Made a banana cake!
makeCakeLater();

 

 

클로저로 private 변수 만들기

지금까지 배워 알고 있듯, 함수 내부에서 만들어진 변수는 바깥 변수에서 접근할 수 없습니다.

이러한 이유로 그 변수들은 private 변수라고 불립니다.

하지만, 때때로 우리는 private 변수에 접근할 필요가 있습니다. 우린 클로저를 이용하여 private 변수에 접근할 수 있습니다.

function secret (secretCode) {
  return {
    saySecretCode () {
      console.log(secretCode);
    }
  }
}

const theSecret = secret('CSS Tricks is amazing');
theSecret.saySecretCode()
// 'CSS Tricks is amazing'

위 예제에서 saySecretCode는 유일하게 기존 secret 함수 밖에서 secretCode를 노출하는 함수입니다.

보통 이러한 경우, 이 함수는 privileged function이라 불립니다.

반응형

'Frontend' 카테고리의 다른 글

lazy loading : dynamic import  (0) 2022.06.20
코딩 컨벤션  (0) 2022.06.19
실행 Context 요약  (0) 2022.06.19
SOLID 원칙 총정리  (0) 2022.06.17
Event Bubbling & Capturing  (0) 2022.06.17