클로저(Closure)
클로저는 함수와 함수가 선언된 렉시컬 스코프의 조합이다.
렉시컬 스코프
함수가 어디에서 호출했는지가 아니라 어디에 선언되었는지에 따라 스코프가 결정되는 것을 말한다.
어디에서 호출되었는지에 따라 스코프가 결정되는 것을 동적 스코프
라고 한다.
1 | var x = 1; |
위의 예제에서 javascript는 선언할 때 스코프가 결정되므로 B 함수에서 사용하는 x
는 선언할 때 스코프를 따라 가장 상위의 var x = 1;
를 사용한다. A 함수를 호출했을 때, x
가 새로 선언되어도 B 함수 스코프에 영향을 주지 않는다.
클로저의 예시
1 | function makeFunc() { |
위 예제에서 makeFunc() 함수가 종료되었음에도 name
변수가 사라지지 않고 makeFunc의 리턴 함수인 displayName
이 호출되었을 때 여전히 참조 가능 한 것을 알 수 있다.
javascript는 참조를 사용하는 곳이 모두 없어지지 않으면 참조를 제거하지 않는다.
그래서 makeFunc()
함수가 종료되어도 렉시컬 스코프에 의해 클로저가 형성되어 name
의 참조 사용이 유지된다.
참조:
https://developer.mozilla.org/ko/docs/Web/JavaScript/Closures