24장 클로저
- 클로저는 함수와 그 함수가 선언된 렉시컬 환경과의 조합임
24.1 렉시컬 스코프
- 자바스크립트 엔진에 의해 함수를 어디서 호출했는지가 아니라 함수를 어디에 정의했는지에 따라 상위 스코프를 결정하는 것을 렉시컬 스코프(정적 스코프)라 함
- 렉시컬 환경의 상위 스코프에 대한 참조는 함수 정의가 평가되는 시점에서 함수가 정의된 환경(위치)에 의해 결정되는 것이 렉시컬 스코프임
24.2 함수 객체의 내부 슬롯 [[Environment]]
- 함수는 자신의 내부 슬롯 [[Environment]]에 상위 스코프의 참조를 저장함
함수 코드 평가 순서
- 함수 실행 컨텍스트 생성
- 함수 렉시컬 환경 생성
2.1 함수 환경 레코드 생성
2.2 this바인딩
2.3 외부 렉시컬 환경에 대한 참조 결정
24.3 클로저와 렉시컬 환경
- 외부 함수보다 중첩 함수가 더 오래 유지되는 경우 중첩 함수는 이미 생명 주기가 종료한 외부 함수의 변수를 참조할 수 있는데 이러한 중첩 함수가 클로저임
24.4 클로저의 활용
- 클로저는 상태(state)를 안전하게 변경하고 유지하기 위해 사용함, 상태를 안전하게 은닉하고, 특정 함수에게만 상태변경을 허용하기 위해 사용
- 아래와 같이 함수가 호출될 때마다 상태가 변경되기 이전상태를 유지할 수 있도록 하기 위해서 클로저를 사용함
// 카운트 상태 변경 함수
const increase = (function () {
// 카운트 상태 변수
let num = 0;
// 클로저
return function () {
// 카운트 상태를 1만큼 증가시킨다
return ++num;
}
}());
console.log(increase()); // 1
console.log(increase()); // 2
console.log(increase()); // 3
24.5 캡슐화와 정보 은닉
- 완벽한 정보 은닉이 필요하다면 class문법 사용!