클로저의 개념과 사례를 알아보자!
그리고 왜 클로저가 필요한지 알아보자!
클로저란❓
- 함수가 속한 렉시컬 스코프를 기억하여 함수가 렉시컬 스코프 밖에서 실행될 때에도 이 스코프에 접근할 수 있게 하는 기능을 뜻한다.
- 렉시컬 스코프란 개발자가 코드를 작성할 때 함수를 어디에 선언하는지에 따라 정의되는 스코프를 말한다.
- 클로저(closure)는 내부함수가 외부함수의 맥락(context)에 접근할 수 있는 것을 가르킨다.
- 클로저는 상위 스코프를 기억하는 것이다.
🤔 코드로 살펴보자
function outer(){
var title = 'coding everybody';
function inner(){
console.log(title);
}
inner();
}
outer(); //coding everybody
- 함수 outer의 내부에는 함수 inner가 정의 되어 있다. 함수 inner를 내부 함수라고 한다.
- 내부함수는 외부함수의 지역변수에 접근할 수 있다. 결과는 coding everybody이다.
이것이 클로저인가!? 기술적으로 그렇다!
- 함수 inner()는 outer() 스코프에 대한 클로저를 가진다.
- 그러나 위의 예제를 설명하는 가장 정확한 방식은 렉시컬 스코프 검색 규칙에 따라 설명하는 것이고, 이 규칙은 클로저의 일부일 뿐이다!
😡 정체를 드러낼 수 있는 코드는 없어?
function foo() {
var a = 2;
function bar() {
console.log(a);
}
return bar;
}
var baz = foo();
baz(); //2
- 함수 bar는 함수가 선언된 렉시컬 스코프 밖에서 실행됐다.
- 일반적으로 가비지 콜렉터에 의해 사용하지 않는 함수는 메모리에 저장되지 않기 떄문에 foo()의 내부 스코프는 사라졌어야 한다.