MDN
: “A closure is the combination of a function and the lexical environment within which that function was declared.”
:클로저는 함수와 그 함수가 선언됐을 때의 렉시컬 환경(Lexical environment)과의 조합이다.
(렉시컬 환경 : 함수를 호출할 때가 아니라 함수를 어디에 선언하였는지에 따라 결정되는 스코프, outerFunc)
위의 내용을 쉽게 풀어쓰면 아래와 같다.
자신을 포함하고 있는 외부함수보다 내부함수가 더 오래 유지되는 경우, 외부 함수 밖에서 내부함수가 호출되더라도 외부함수의 지역 변수에 접근할 수 있는데 이러한 함수(내부 함수)를 클로저(Closure)라고 부른다.
즉, 외부 함수가 종료되어 실행 컨텍스트가 반환 되더라도, 내부 함수가 참조하고있는 활성 객체(외부 함수의 자유 변수, 함수 등..)는 유효하다. (스코프 체인을 통해 참조 가능.)
function outerFunc() {
var x = 10;
var innerFunc = function () { console.log(x); };
return innerFunc;
}
/**
* 함수 outerFunc를 호출하면 내부 함수 innerFunc가 반환된다.
* 그리고 함수 outerFunc의 실행 컨텍스트는 소멸한다.
*/
var inner = outerFunc();
inner(); // 10