클로저
MDN
클로저는 함수와 함수가 선언된 어휘적 환경의 조합이다
MDN은 위와 같이 클로저를 설명하고 있습니다.
결국 자신이 선언된 환경이 아닌 곳에서 호출되었을 때 선언된 환경에 접근할 수 있는 함수를 말합니다. 정확히 함수를 말하는 것이 아닌 함수와 환경의 조합입니다. 하지만 그러한 함수 그 자체를 클로저로 부르기도 합니다.
위에서 설명하는 '환경' 에 대해 조금 더 쉽게 설명하는 문장이 아래와 같습니다.
생활코딩
클로저(closure)는 내부함수가 외부 함수의 맥락(context)에 접근할 수 있는 것
MDN에서는 클로저를 알기 전에 자바스크립트 변수 유효범위 지정(Lexical scoping)을 알아야한다고 합니다.
Lexical scoping
위와 예제에서 person
함수를 실행 했을 때 My name is jinwoo
라는 로그가 정상적으로 실행됩니다.
displayName
함수에서 intro
변수에 접근하여 정상적으로 실행됐습니다. 이로 내부 함수에서는 외부 함수의 값을 접근할 수 있다는 것을 알 수 있습니다.
클로저
위와 비슷한 예제이지만 조금 다릅니다. displayName
이라는 함수를 반환하고 반환 받은 displayName
을 외부에서 다시 호출합니다.
결과는 마찬가지로 정상적으로 로그가 실행됩니다.
여기서 person()
이 실행된 후 displayName
을 반환한 후 종료된 함수의 변수인 intro
는 사려져야합니다. 하지만 왜displayNameFunc()
를 통해 정상적으로 intro
의 값이 로그에 찍히는 걸까요?
이게 클로저(closure)
입니다. 외부 함수가 종료되어도 내부 함수는 자신이 선언된 환경, 외부 함수의 환경에 접근할 수 있습니다.
하지만 클로저는 각자의 환경을 기억하기에 클로저의 내부에서 사용되는 변수의 메모리를 GC(가비지 컬렉터)
가 회수하지 않습니다.
위와 같이 클로저의 참조를 초기화해주어야합니다.
'개발 > Javscript,Typescript' 카테고리의 다른 글
[JS] 프로토타입 (Prototype) (2) | 2021.03.29 |
---|---|
[JS] 순수함수 (Pure Function) (0) | 2021.03.27 |
[JS] 전개(spread)는 완전히 깊은 복사일까? (2) | 2021.02.08 |
[JS] 자바스크립트의 동작 원리 (4) | 2021.02.04 |
[JS] Promise 잘 처리하기 (비동기 병렬) (0) | 2021.02.01 |