클로저는(closure)는 자바스크립트에서 중요한 개념 중 하나입니다.
실행 컨텍스트를 알고 있다면 쉽게 이해할 수 있는 개념입니다.
내부 함수가 외부 함수의 맥락(context)에 접근할 수 있는 것을 나타냅니다.
외부 함수는 외부 함수의 지역변수를 사용하는 내부 함수가 소멸될 때까지 소멸되지 않는 특성을 의미합니다.
function makeFunc() {
var name = "voler";
function alertName() {
alert(name);
}
return alertName;
}
var myFunc = makeFunc();
// myFunc변수에 alertName을 리턴합니다.
// 유효범위의 어휘적 환경을 유지
myFunc();
// 리턴된 alertName 함수를 실행(name 변수에 접근)
외부 함수인 makeFunc()로부터 내부에 있는 alertName() 함수가 실행되기 전에 리턴되어 myFunc변수에 저장되는 예제입니다.
현재 예제만 보게 되면 현재 이 코드가 여전히 작동하는 것으로는 보이지 않을 수 있습니다. 몇몇 프로그래밍 언어 세터는 함수 안의 지역 변수들은 그 함수가 처리되는 동안에만 존재하기 때문이죠, makeFunc() 함수 실행이 끝나게 되면 (alertName() 함수가 리턴되고 나면) name변수에 더 이상 접근할 수 없게 될 것으로 예상하는 것이 일반적입니다.
하지만 위의 예시와 자바스크립트의 경우는 다릅니다. 그 이유는 자바스크립트는 함수를 리턴하고, 리턴하는 함수가 클로저를 형성하기 때문입니다. myFunc 변수는 makeFunc() 함수가 실행될 때 생성된 alertName() 함수의 인스턴스에 대한 참조입니다. alertName의 인스턴스는 변수 name 이 있는 어휘적 환경에 대한 참조를 유지하며 이런 이유로 myFunc가 호출될 때 변수 name은 사용할 수 있는 상태로 남게 되고 "voler"가 alert에 전달되게 됩니다.
출처:MDN