클로저
클로저
함수와 함수가 선언된 어휘적 환경(렉시컬 스코프)의 조합입니다. 렉시컬 스코프는 함수를 어디서 호출하는지가 아니라 어디에 선언하였는지에 따라 결정됩니다.
클로저는 함수가 속한 렉시컬 스코프를 기억하며 함수가 렉시컬 스코프 밖에서 실행될 때도 그 스코프에 접근할 수 있게 하는 기능을 말합니다. 내부함수가 외부함수의 값을 변경할 수 있는 것 입니다.
함수를 사용하는 곳이면 어디든지 적용이 가능하며, 특정 상태를 기억해 캡슐화하거나 하나의 모듈을 정의하는 패턴으로 사용할 수 있습니다.
코드 예시
1
2
3
4
5
6
7
8
9
function outer() {
var a = 2;
function inner() {
console.log(a);
}
return inner;
}
var func = outer();
func(); // 2
var func
는function inner()
를 리턴func()
은function inner()
을 실행 (변수 a에 접근)
클로저의 장점
1. 예측가능한 코드, 변수 충돌 방지
클로저를 사용하면 함수 내부에서 외부 범위의 변수들을 보호하고 안전하게 사용할 수 있게 해줍니다. 이는 코드를 예측 가능하게 만들고, 변수의 충돌을 방지해줍니다.
2. 캡슐화
캡슐화란 데이터와 함수를 하나로 묶은 것을 의미합니다. 클로저는 함수와 함수에서 사용되는 변수들을 함께 묶어 캡슐화를 구현할 수 있습니다. 이렇게 데이터와 기능을 함께 묶으면 모듈의 내부 구현을 외부로부터 숨길 수 있기 때문에 정보 은닉이 가능해집니다.
3. 모듈화
모듈화란 프로그램을 작은 단위로 분해하고 각각의 독립적인 모듈로 구성하는 것을 의미합니다. 클로저를 사용하면 함수와 함수가 사용하는 변수들을 하나의 독립된 모듈로 만들 수 있습니다.
클로저 사용할 때 주의할 점
1. 메모리 누수
클로저는 외부 스코프에 있는 변수에 대한 참조를 유지합니다. 만약 클로저가 외부 스코프에 있는 변수를 계속 유지할 경우 가비지 컬렉터에 의해 회수되지 않아 메모리 누수를 발생시킬 수 있습니다.
2. 성능 문제
클로저는 외부 스코프에 접근하기 위해 추가적인 과정을 거치기때문에 이는 일반적인 함수 호출보다 더 많은 시간을 소비할 수 있습니다.
3. 변수 값의 예상치 못한 변경
클로저를 사용하면 외부 스코프에 있는 변수를 수정할 수 있습니다. 이는 의도하지 않은 결과가 발생될 수도 있기때문에 주의해야합니다.
4. 가독성과 유지보수성
클로저를 사용하면 변수와 함수들이 숨겨져 있어서 코드를 읽고 이해하는데 어려움을 겪을 수 있습니다.