MDN에서는 클로저에 대해 “A closure is the combination of a function and the lexical environment within which that function was declared.”라고 소개한다. ⇒ “클로저는 함수와 그 함수가 선언될 당시의 lexical environment의 상호관계에 따른 현상”
LexicalEnvironment의 environmentRecord와 outerEnvironmentReference에 의해 변수의 유효범위인 스코프가 결정되고 스코프 체인이 가능해진다고 했다.
내부함수에서 외부 변수를 참조하는 경우에 한해서만 combination, 즉 ‘선언될 당시의 LexicalEnvironment와의 상호관계’가 의미가 있을 것.
⇒ 지금까지 살펴본 바, 클로저란 “어떤 함수에서 선언한 변수를 참조하는 내부함수에서만 발생하는 현상”이라고 볼 수 있다.
//* 5-1 외부 함수의 변수를 참조하는 내부 함수(1)
var outer = function () {
var a = 1;
var inner = function () {
console.log(++a);
};
inner();
}
outer(); // 2
//* 5-2 외부 함수의 변수를 참조하는 내부 함수(2)
var outer = function () {
var a = 1;
var inner = function () {
return ++a;
};
return inner();
};
var outer2 = outer();
console.log(outer2); // 2
//* 5-3 외부 함수의 변수를 참조하는 내부 함수(3)
var outer = function () {
var a = 1;
var inner = function () {
return ++a;
}
return inner;
};
var outer2 = outer();
console.log(outer2()) // 2
console.log(outer2()) // 3
⇒ 다시 정의하면, 클로저란 어떤 함수 A에서 선언한 변수 a를 참조하는 내부 함수 B를 외부로 전달할 경우 A의 실행 컨텍스트가 종료된 이후에도 변수 a가 사라지지 않는 현상