지식 정리 📝

Closures - 클로저

엄성준 2023. 6. 19. 23:22

클로저란? 내부 함수에서 외부 함수에 맥락에 접근할 수 있는 권한입니다.

 

그렇다면 일반적인 함수에서 전역 변수를 가리키는 것도 모두 클로저일까요?

 

- 당연히 아닙니다. 외부 함수 안에 내부함수가 묶여있는 느낌과 같이 폐쇄적인 느낌을 주는 것이 클로저입니다.

 

 

다음은 클로저 예제입니다.

function outer() {
  const x = 0;
  function inner() {
    console.log(`inside inner: ${x}`); // closures라는 특성 때문에 외부 함수의 변수에 접근할 수 있음
  }
  return inner;
}

const func = outer(); // inner함수만 할당 받는 것이 아닌 외부 함수의 렉시컬 환경까지 참조 받음
func();

func라는 변수에 outer()를 할당하고 func() 함수를 실행시켰는데 outer() 함수 안에 내부 함수인 inner() 함수의 console.log() 문장이 실행되는 것을 알 수 있습니다.

 

이보다 더 정확한 예제를 보여드리겠습니다.

function count() {
  let count = 0;
  function up() {
    count++;
    console.log(count);
  }
  return up;
}

const countFunc = count(); // 내부 함수를 통해서 외부 함수 렉시컬 환경에 있는 데이터를 조작할 수 있음
countFunc();
countFunc();

counFunc 변수에 count() 함수를 할당해 주었습니다. 외부 함수 렉시컬 환경에서 선언된 count 변수에 초기값은 0입니다. 하지만 외부에서 countFunc() 함수를 실행하면 어떤 일이 벌어질까요?

맞습니다. 내부 함수 up()을 통해서 외부 함수에 선언 된 변수 count의 값을 조작할 수 있습니다.

이게 바로 클로저의 가장 큰 특징입니다.

또한 외부에서 내부함수를 직접적으로 호출하는 것이 아닌 외부에서 내부 함수를 통해서 값을 조작하는 것이기 때문에 정보를 은닉할 수 있는 또 하나의 큰 특징을 살펴볼 수 있었습니다.

 

한 줄 요약 : 클로저란? 내부 함수에서 외부함수에 맥락에 접근할 수 있는 것 또한 클로저의 가장 큰 특징은 캡슐화 및 정보 은닉!