


const x = 1;
// (1)
function outer(){
const x = 10;
const inner = function () { console.log(x); }; // (2)
return inner;
}
// outer 함수를 호출하면 중첩 함수 inner를 반환한다.
// 그리고 outer 함수의 실행 컨텍스트는 실행 컨텍스트 스택에서 팝되서 제거된다.
const innerFunc = outer(); // (3)
innerFunc(); // (4) 10
outer 함수 실행이 종료되면 outer함수의 지역 변수 x 또한 생명 주기를 마감하여 유효하지 않아야 하지만 반환된 중첩 함수 inner로 인해 생명주기가 종료한 외부함수의 변수를 참조할 수 있게 된다.


outer 함수의 생명주기가 종료되면 실행 컨텍스트는 실행 컨텍스트 스택에서 제거되지만 outer함수의 렉시컬 환경까지 소멸하는 것은 아니다

클로저는 중첩 함수가 상위 스코프의 식별자를 참조하고 있고 중첩 함수가 외부 함수보다 더 오래 유지되는 경우에 한정하는 것이 일반적이다.
클로저에 의해 참조되는 상위 스코프의 변수
클로저를 사용한 상태 변경 함수
// 카운트 상태 변경 함수
const increase = function() {
// 카운트 상태 변수
let num = 0;
// 클로저
return function {
// 카운트 상태를 1만큼 증가시킨다
return ++num;
}
}());
console.log(increase()); // 1
console.log(increase()); // 2
console.log(increase()); // 3
객체의 상태를 나타내는 프로퍼티와 프로퍼티를 참조하고 조작할 수 있는 동작인 메서드를 하나로 묶는 것
자바스크립트는 정보 은닉을 완전하게 지원하지 않는다.