
클로저를 이해하기 위해서는 스코프를 알아야 한다.
클로저(Closure)는 함수와 함수가 선언된 Lexical Environment의 조합이다. 함수가 선언될 때 주변의 Scope를 기억하고, 함수가 외부에서 호출될 때 기억해둔 환경을 접근하는 것을 말한다.
(함수 내부에서 선언된 내부 함수가 외부 함수의 변수나 매개변수를 기억하고 사용)
컨텍스트 A에서 선언한 변수 a를 참조하는 내부함수 B를 A의 외부로 전달할 경우, A가 종료된 이후에도 a가 사라지지 않는 현상
var outer = function () {
var a = 1;
var inner = function () {
console.log(++a);
};
return inner; // inner 함수를 반환
}
var outer2 = outer(); // outer 함수 호출 후, 반환된 inner 함수를 outer2에 할당
outer2(); // outer2를 호출하여 inner 함수 실행 -> 2 출력
outer2(); // outer2를 호출하여 inner 함수 실행 -> 3 출력
반환된 inner() 함수만 실행되었지만, outer() 함수의 매개변수 a가 변경되었다.
outer() 함수가 실행될 때 a 변수가 생성된다. inner() 함수가 반환면서 inner() 함수는 외부 함수인 outer()의 변수인 a에 대한 참조를 유지한다. inner() 함수는 외부 함수인 outer()의 변수인 a에 대한 접근 권한을 유지하고 있으므로 이것을 클로저라고 한다.
함수 내부에서 다른 함수를 정의하고 return하는 경우 클로저를 형성한다. 내부 함수는 외부 함수의 범위에 접근할 수 있다.
내부 함수가 외부 함수에서 선언된 변수를 참조하는 경우, 외부 함수가 종료된 이후에도 내부 함수가 그 변수를 기억해뒀다가 접근한다.
클로저는 함수가 선언된 Lexical Environment를 기억한다. 함수가 선언된 위치에 따라 해당 함수가 접근할 수 있는 변수와 스코프를 결정한다.
변수와 함수의 접근을 제한하고 캡슐화할 수 있다. 내부 함수는 외부 함수의 범위에 접근할 수 있지만, 외부에서는 내부 함수에 직접 접근할 수 없다. 코드의 안정성과 보안성을 높일 수 있다.
함수가 외부 범위의 변수에 대한 참조 유지가 가능하다. 데이터를 스코프에 가둬두고 사용할 수 있게 하므로, 데이터 보존 문제를 해결할 수 있다.
콜백 함수로 전달되는 외부 범위의 변수를 사용할 수 있다. 콜백 함수가 호출될 때마다 원하는 상태를 유지하고 처리할 수 있다. 비동기 작업에서 클로저를 사용하여 상태 유지와 데이터 보존도 가능하다.
변수와 함수를 모듈로 묶어서 구조화할 수 있다. 각 모듈은 독립적이고, 필요 시에 원하는 모듈을 사용 가능하다. (재사용성, 유지보수성 향상)