렉시컬 환경과 함께 묶인 함수의 조합이다.

클로저

설명만으론 이해하기 힘들 것 같다. 그림으로 이해해보자.

(페이지를 확대하면 보여요!)

개념적으로 모든 함수는 클로저다.
함수는 선언될 때 항상 렉시컬 환경과 함께 묶이기 때문이다.

그러나 우리가 알아야 할 클로저는 다음 2가지 조건을 만족해야 한다.
1. 자유 변수를 사용한다.
2. 실행 컨텍스트가 사라져도 렉시컬 환경이 살아남아야 한다.

자유 변수는 상위 렉시컬 환경의 변수를 말한다.
위 그림에서는 foo 함수 내부의 x를 일컫는 말이다.
아래의 코드는 자유 변수를 사용하지 않으므로 통상적으로 클로저라 부르지 않는다.

또한, boo 함수는 test가 계속 사용하기 때문에 boo 실행 컨텍스트가 pop되어도 boo 렉시컬 환경은 계속 살아남는다.
아래의 코드는 렉시컬 환경이 살아남지 못하므로 통상적으로 클로저라 부르지 않는다.

for문

이번엔 좀더 복잡한 케이스를 살펴보자.
그전에 for문이 어떻게 동작하는지부터 알아보자.

for문은 블록 렉시컬 환경을 loop할 때마다 새롭게 만든다.
i = 0일 때 새로운 블록 렉시컬 환경을 만들고,
i = 1일 때 새로운 블록 렉시컬 환경을 만든다는 의미다.

함수 역시 호출될 때마다 새로운 렉시컬 환경을 만든다.
i = 0일 때 새로운 함수 렉시컬 환경을 만들고,
i = 1일 때 새로운 함수 렉시컬 환경을 만든다는 의미다.

위 그림에서의 foo는 클로저가 아니다.
자유 변수를 사용하지만 실행 컨텍스트와 함께 렉시컬 환경도 제거되기 때문이다.

이번엔 코드를 살짝 바꿔서 클로저를 만들어보자.

for문 + 클로저

() => foo(i) 라는 익명 함수를 클로저로 만들었다.

  • i라는 자유변수를 사용한다.
  • 익명 함수 실행 컨텍스트가 종료되어도 test의 element가 익명 함수 렉시컬 환경을 사용하기 때문에 가비지 컬렉터에 의해 제거되지 않는다.

    즉, 익명 함수 실행 컨텍스트보다 익명 함수 렉시컬 환경이 더 오래 살아남는다.

profile
Software Engineer

0개의 댓글