공식 설명
"Closure"는 많은 변수를 가지고 있고 이러한 변수를 바인딩하는 환경 표현식(보통 함수)이므로 이러한 변수도 환경 표현식의 일부입니다.
인기 있는 설명
Javascript의 모든 기능은 클로저입니다. 그러나 일반적으로 말하면 중첩된 함수에 의해 생성된 클로저가 더 강력합니다. 이를 우리는 대부분 "클로저"라고 부릅니다. 다음 코드를 보세요.
< script type="text/ javascript">
이 스크립트에서 var c=a()를 실행한 후 실제로 함수 b를 가리키는 변수가 사용됩니다. 변수 i는 b에서 사용됩니다. c()를 실행하면 i의 값을 표시하는 창이 나타납니다. 이 코드는 실제로 클로저입니다. 이유는 무엇입니까? 함수 a 외부의 변수 c는 함수 a 내부의 함수 b를 참조하기 때문입니다.
Javascript의 가비지 수집 메커니즘
JavaScript의 특수한 가비지 수집 메커니즘으로 인해 클로저가 생성됩니다. Javascript 가비지 수집 메커니즘의 일반 규칙은 다음과 같습니다.
JavaScript에서 객체가 더 이상 참조되지 않으면 해당 객체는 GC에 의해 재활용됩니다. 두 객체가 서로를 참조하고 더 이상 제3자가 참조하지 않는 경우, 서로를 참조하는 두 객체도 재활용됩니다. 위 스크립트에서 함수 a는 b에서 참조되고, 함수 b는 함수 a 외부에서 c에서 참조됩니다. 이것이 바로 함수 a가 실행 후 재활용되지 않는 이유입니다.
클로저 적용 시나리오
1. 함수 내 변수를 보호합니다. 위의 예를 예로 들면, 함수 a의 변수 i는 함수 b를 통해서만 접근할 수 있고 다른 수단으로는 접근할 수 없으므로 i의 보안이 보호됩니다.
2. 메모리에 변수를 유지합니다. 위의 예와 마찬가지로 클로저로 인해 함수 a의 i는 항상 메모리에 존재하므로 c()가 실행될 때마다 i는 1씩 증가합니다.
3. 변수 보안을 보호하여 JS 프라이빗 속성과 프라이빗 메서드를 구현합니다(외부에서 접근할 수 없음). 다음과 같이 생성자 외부에서는 프라이빗 속성과 프라이빗 메서드에 접근할 수 없습니다.
함수 생성자(…){
var that = this;
var membername = value
function membername(…){…}
}