MDN에 있는 내용,
클로저는 “둘러싸여진 상태”와 함께 다발로 묶여진 함수의 콤비네이션이다.
바꿔말하면 클로저는 내부함수로부터 외부함수에의 접근권한을 준다.
클로저는 함수 생성 시점에 언제나 생긴다.
24-01
const x = 1;
function OuterFunc () {
const x = 10;
function innerFunc() {
console.log(x); // 10
} // innerFunc 함수 생성 시점에, innerFunc와 OuterFunc 사이의 closure 생김
innerFunc();
} // OuterFunc 함수 생성 시점에, OuterFunc와 전역컨텍스트 사이의 closure가 생김
OuterFunc();
24-03
const x = 1;
function foo () {
const x = 10;
bar(); // 여기서 실행했어도, 함수 생성 시점에 클로저가 생기므로
}
function bar () {
console.log(x);
}
foo(); // 1
bar(); // 1
24-05
const x = 1;
// 1번
function outer () {
const x = 10;
const inner = function () {console.log(x);} // 2번
}
// outer 함수를 호출하면 중첩 함수 inner를 반환한다.
// 그리고 outer 함수의 실행 컨텍스트는 실행 컨텍스트는 실행 컨텍스트 스택에서 팝되어 제거된다.
const innerFunc = outer();
innerFunc(); // 10

24-5처럼,
외부 함수보다 중첩 함수가 더 오래 유지되는 경우
중첩 함수는 이미 생명 주기가 종료한 외부 함수의 변수를 참조할 수 있다.
이러한 중첩 함수를 클로저라고 함!
그런데!
자바스크립트의 모든 함수는 상위 스코프를 기억하므로
이론적으로는 모든 함수가 클로저임