Pko

js - 클로저 본문

language/js

js - 클로저

pastko 2021. 7. 1. 18:14

 

클로저 (closure)

 

클로저(closure)는 자바스크립트에서 중요한 개념 중 하나로 MDN 공식문서를 참고하면 아래와 같이 설명하고 있다.

 

"함수와 함수가 선언된 어휘적(lexical) 환경의 조합을 말한다. 이 환경은 클로저가 생성된 시점의 유효 범위 내에 있는 모든 지역 변수로 구성된다."

 

물론 클로저는 자바스크립트만의  고유의 개념은 아니고 함수를 일급 객체로 취급하는 함수형 프로그래밍 언어(Functional Programming language: 얼랭(Erlnag), 스칼라(Scala), 하스켈(Haskell), 리스프(Lisp)…)에서 사용되는 중요한 특성이다.

 

 

 

 

 

클로저를 이해하기 앞서서 

 

"함수와 함수가 선언된 어휘적(lexical) 환경의 조합을 말한다"

 

이 말만 가지고는 클로저가 무었인지 잘 이해되지 않는다 그래서 아래 코드를 보면서 이해해 보자.

funtion outer ()
{
    let values = 0;
    return inner()
    {
    	values += 25;	
    }
}

outer();

 

함수 outer 내에서 내부함수 inner가 선언되고 호출되었다. 이때 내부함수 inner는 자신을 포함하고 있는 외부함수 outer의 변수 values에 접근할 수 있다. 이는 함수 inner가 함수 outer의 내부에 선언되었기 때문이다.

 

 

funtion outer ()
{
    let values = 0;
    return inner()
    {
    	return values += 25;	
    }
}


let inners =  outer();
console.log(inners());  // 25 

 

그런데 만약 위와 같은 방법으로 사용하게 되면 outer()함수는 inners 변수에 inner()함수를 반환하고  life-cycle 종료었다. 그런데 inners()를 호출하게 되면 outer()함수가 이미 life-cycle이 종료되어 실행 컨텍스트 스택에서 제거된 함수의 지역변수 values가 다시 부활이라도 한 듯이 동작하고 있다.

 

이러한 상황 외부함수보다 내부함수가 더 오래 유지되는 경우, 외부 함수 밖에서 내부함수가 호출되더라도 외부함수의 지역 변수에 접근할 수 있는데 이러한 함수를 클로저(Closure)라고 부른다.

 

즉 외부함수가 이미 반환되었어도 외부함수 내의 변수는 이를 필요로 하는 내부함수가 하나 이상 존재하는 경우 계속 유지된다. 이때 내부함수가 외부함수에 있는 변수의 복사본이 아니라 실제 변수에 접근한다는 것에 주의하여야 한다.

 

 

 

 

 

 

 

 

- 단점 

 

클로저는 자신이 생성될 때의 환경(Lexical environment)을 기억해야 하므로 메모리 차원에서 손해를 볼 수 있다. 

가비지 컬랙터는 모든 참조가 없어저야 메모리에서 삭제하기 때문에 크로저 상태에서는 해당 메모리를 지속적으로 사용하고 있는 상태가 된다. 

 

 

 

 

- 참조

https://poiemaweb.com/js-closure

 

Closure | PoiemaWeb

클로저(closure)는 자바스크립트에서 중요한 개념 중 하나로 자바스크립트에 관심을 가지고 있다면 한번쯤은 들어보았을 내용이다. execution context에 대한 사전 지식이 있으면 이해하기 어렵지 않

poiemaweb.com

 

'language > js' 카테고리의 다른 글

Strict mode & Sloppy mode  (0) 2021.07.20
js - Array  (0) 2021.07.06
js 호이스팅  (0) 2021.07.03
js 자료형  (0) 2021.07.01
js - 조건문  (0) 2021.06.15