본문 바로가기
js/개발

js 클로저

by 냉면돈가스 2023. 2. 23.

클로저란

 

실행 컨텍스트 스택에서 제거된 후 렉시컬 환경이 보통 제거되지만,

사라져야할 렉시컬 환경의 식별자를 외부에서 참조하고있다면

렉시컬 환경이 유지됨

 

더 쉽게 말하면

a 라는 함수내부에 x변수가 있고,

a 함수가 종료되었으면 x변수도 정리되어야함

단, x변수를 외부에서 참조하고있다면 정리되지 않음

 

실행 컨텍스트를 알아야 이해가 더 쉬울 수 있음

https://yamyam-naengmyeon-donkats.tistory.com/114

 

js 실행컨텍스트

소스코드의 타입 ㄱ. 전역코드 - 최상위 코드인 전역 스코프를 생성 후, 전역 객체와 연결 - 이를 위해 전역 코드가 평가되면 전역 실행 컨텍스트가 생성됨 ㄴ. 함수코드 - 함수마다의 지역 스코

yamyam-naengmyeon-donkats.tistory.com


클로저 예시

 

외부함수가 실행되는 과정에서

외부함수의 렉시컬 환경에 x가 등록되었음

이후, 함수가 종료되며 렉시컬 환경이 같이 버려지는게 아닌

"외부함수의 x를 참조하는 함수" 를 반환하여

렉시컬 환경을 계속 외부에서 참조하게 만듬

 

즉, 외부함수가 종료되었음에도 렉시컬 환경을 참조하니

외부함수 내부 x의 상태가 유지됨

 

a를 실행할때마다 내부함수가 실행되는데

x의 상태가 유지되어 1씩 올라감


클로저의 장점

 

위 코드를 클로저로 사용을 안한다면 아마 아래 예시처럼 나올것임

코드는 짧아져 편하긴 하지만,

아래와 같은 장점이 있음

 

변수의 스코프를 최대한 축소한다.

 

위 코드에선 x가 함수 외부에 있음

지금은 예시가 짧아 문제가 없겠지만

x가 만약 value라는 이름이었다면

유사한 이름의 value 변수들이 많았을것임

즉 변수명 짓기도 쉬워지고 중첩되는 문제를 어느정도 해소해준다.

 

위와 같은이유로 그냥 a라는 기능에만 있을 변수들이라면

한 곳에 몰아넣어주고싶음

 

 

 

 

 

'js > 개발' 카테고리의 다른 글

js async & await  (0) 2024.08.07
js 생성시점때 형제스코프내에서 메소드를 찾고싶을때  (0) 2023.09.11
js 생성자함수  (0) 2023.02.15
js 재귀함수 & 콜백함수  (0) 2023.02.12
js 빌트인 객체  (0) 2022.12.18

댓글