WEB/JavaScript
[자바스크립트] 클로저
jimyu
2024. 7. 20. 00:20
- 함수를 일급 객체로 취급하는 함수형 프로그래밍 언어에서 사용되는 개념이다.
- “함수와 그 함수가 선언된 렉시컬 환경과의 조합” -MDN
- 외부 함수보다 중첩 함수가 더 오래 유지될 때, 중첩 함수는 생명 주기가 종료된 외부 함수 변수를 여전히 참조할 수 있는데, 이런 중첩 함수를 클로저라고 한다.
렉시컬 스코프
- 이전에 다뤘듯이, 렉시컬 스코프란 정적 스코프라고도 하며, 함수 정의가 평가되는 시점에 함수가 호출된 위치가 아니라 함수가 정의된 위치에 따라 상위 스코프가 정적으로 결정된다.
- 스코프의 실체는 실행 컨텍스트의 렉시컬 환경이고, 이 렉시컬 환경은 외부 렉시컬 환경에 대한 참조로 상위 렉시컬 환경과 연결되는 스코프 체인을 가진다.
클로저의 원리
함수 객체의 내부 슬롯 [[Environment]]
- 함수가 정의된 환경과 함수가 호출된 환경이 다를 수 있다. 따라서 렉시컬 스코프가 가능하려면 호출 환경과 상관없이 자신의 정의 환경을 기억해야 한다. 이를 위해 함수는 자신의 내부 슬롯 [[Environment]]에 자신이 정의된 환경인 상위 스코프 참조를 저장한다. 이는 함수 자신이 존재하는 한 기억된다.
- 함수 코드 평가 시에 함수 렉시컬 환경을 생성하는 과정에서, 이 내부 슬롯에 저장된 정의 환경을 외부 렉시컬 환경에 대한 참조로 할당한다.
클로저의 활용
- 상태를 안전하게 변경하고 유지하기 위해 사용
- 상태를 안전하게 은닉
- 특정 함수에게만 상태 변경 허용