[JS] 클로저의 의미와 원리 이해 Closure

daybyday·2021년 1월 22일
0

Javascript

목록 보기
12/15
post-thumbnail

클로저의 정의

클로저는 여러 함수형 프로그래밍 언어에서 등장하는 보편적인 특성이다. 자바스크립트 고유의 개념이 아니라 ECMAScript 명세서에서도 클로저의 정의를 다루고 있지 않다.

클로저를 정의하는 문장은 굉장히 여러가지이지만 정리해보자면,

클로저란 어떤 함수 A에서 선언한 변수 a를 참조하는 내부함수 B를 외부로 전달할 경우, A의 실행 컨텍스트가 끝난 뒤에도 변수 a가 사라지지 않는 현상 - 코어 자바스크립트(정재남)


클로저 예시

let func1 = function(){
	let a = 1;
  
  	let func2 = function (){
    	return ++a;
    };
  return func2; //func2 함수 자체를 반환
};

let func3 = func1();
console.log(func3()); // 2
console.log(func3()); // 3

func1에서 변수 afunc2 내부함수가 선언되었다. func2a를 참조하여 ++a를 반환하는 함수다. func1func2의 결과를 반환하는 것이 아니라 func2 함수 자체를 반환한다.

그러면 func3 변수는 func2 함수를 참조하게 될 것이다.
다음 줄에서 console.log(func3())을 실행하게되면 func2 함수가 실행될 것이다.

func2는 선언될 당시의 lexical 환경을 기억하고 있으므로 func1의 변수 a를 참조해 ++a한 결과 2를 반환할 것이다.

다음 줄의 console.log(func3())도 a를 참조해 ++a한 결과 3을 반환할 것이다.



이 때, func1의 실행 컨텍스트는 이미 종료된 상태인데 어떻게 func2가 func1의 변수 a를 참조할 수 있는 것일까?

이는 가비지 컬렉터의 동작 방식 때문이다.

가비지 컬렉터는 어떤 값을 참조하는 변수가 하나라도 있다면 그 값은 수집 대상에 포함하지 않는다.

func1 함수는 func2 함수를 반환하므로 func1의 실행이 종료되더라도 언젠가 호출될 가능성이 있기 때문에 수집 대상에서 제외된다.


참조

코어 자바스크립트 - 05-1. 클로저의 의미 및 원리 이해

0개의 댓글