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

Untitled

24-5처럼,

외부 함수보다 중첩 함수가 더 오래 유지되는 경우

중첩 함수는 이미 생명 주기가 종료한 외부 함수의 변수를 참조할 수 있다.

이러한 중첩 함수를 클로저라고 함!

그런데!

자바스크립트의 모든 함수는 상위 스코프를 기억하므로

이론적으로는 모든 함수가 클로저임