: 이미 생명 주기가 종료한 외부 함수의 변수를 참조할 수 있고 외부 함수보다 더 오래 유지되고 있는 중첩 함수
렉시컬 스코프
: 함수를 어디에 정의했는지에 따라 상위 스코프 결정
함수 객체의 내부 슬롯 [[Environment]]
자신의 내부 슬롯 [[Environment]]에 상위 스코프의 참조를 저장(자신을 정의한 위치 기억)
외부 렉시컬 환경에 대한 참조에는 함수 객체 내부 슬롯 [[Environment]]에 저장된 렉시컬 환경의 참조가 할당됨
클로저와 렉시컬 환경
외부 함수의 실행 컨텍스트는 실행 컨텍스트 스택에서 제거되어도 그 렉시컬 환경까지 소멸하지는 않음(누군가가 참조하고 있어 가비지 컬렉션 대상이 아님)
클로저의 활용
상태가 의도치 않게 변경되지 않도록 안전하게 은닉하고 특정 함수에게만 상태 변경을 허용하기 위해 사용
//카운트 상태 변경 함수
const increase = (function () {
//카운트 상태 변수
let num = 0; //은닉된 private 변수
//클로저
return function(){ //즉시 실행 함수는 한번만 도니까 num 초기화 x
return ++num;
};
}());
const Person = (function () {
let _age = 0; //private
function Person(name, age) {
this.name = name; //public
_age = age;
}
Person.prototype.sayHi = function () {
console.log(`Hi! My name is ${this.name}. I am ${_age}`);
};
return Person;
}());