함수 객체와 scope를 조합한 것!!
- 정의가 다소 추상적인데 아래 특징과 사용법을 보면 이해가 갈 것이다
함수가 정의된 곳과 다른 scope에서 호출될 때 사용한다
function closureFunc() {
let n = 0;
return function () {
return n++;
}
}
let s = closureFunc();
let n = closureFunc();
s(); // 1
s(); // 2
n(); // 1
n(); // 2
s는 closureFunc 함수와 다른 scope인 전역 scope에서 선언되었다.n은 함수 scope 밖에서는 접근할 수 없는 것이 맞지만closureFunc의 리턴값인 함수가 할당된 변수 s를 통해 n에 접근할 수 있는 것이다.클로저는 함수 호출 시점의 로컬 변수를 캡쳐한다
➡️ 클로저와 연관된 scope는 다른 scope에 가서도 살아 있다
➡️ 함수는 만들어진 환경을 '기억한다'
s에는 closureFunc 함수 객체가 할당되었다s에는 closureFunc의 리턴문인 함수가 할당되어 있고, 함수 호출 시점의 로컬 변수도 캡쳐되어 있기 때문에 n에 접근할 수 있다.closureFunc() 함수는 호출될 때마다 새로운 함수 객체가 생성되는 것이기 때문에n은 다시 1부터 시작하는 것이다.으로 접근할 수 있다.function closureFunc() {
let n = 0;
return {
count: function () {return n++;},
getNum: function() {return n}
}
}
let s = closureFunc();
s.count(); // 1
s.count(); // 2
s.getNum() // 2function counter(n) {
return {
get count() {return n++}
set count(m) { n = m;}
}
}
let s = counter(10);
s.count(); // 11
s.count(12) // n = 12로 set
get set: js의 접근자 프로퍼티비공개 변수
- 그 변수가 선언된 scope 밖에서 접근할 수 없는 변수
- 즉,.으로 접근이 안되는 변수
자바스크립트 완벽 가이드/ 데이비드 플래네건 지음/ 한빛미디어, O'REILLY
Javascript 클로저(Closure)