나는 오랫동안 JavaScript와 접촉 해 왔으며, 폐쇄를 이해할 때마다 최근 웹 프론트 엔드에서 작업을 찾고 있으므로 재단을 통합해야합니다.
이 기사는 블로그를 기반으로 Joy_Lee 의 블로그 클로저를 말하며 의견 형태로 내 이해를 설명하기 위해 노력합니다. 부적합한 경우, 비판과 교정을 환영합니다.
고급 프로그래밍에서는 다음과 같습니다. 다른 기능이 함수 내부에서 정의되면 폐쇄가 생성됩니다. 폐쇄에는 함수 내에 포함 된 모든 변수에 액세스 할 수있는 권한이 있습니다.
(이 문장을 어떻게 이해합니까?이 문장에 따르면, 폐쇄는 중첩 된 함수입니다! 중첩 된 함수는 물론 포함 된 함수의 변수에 액세스 할 수 있으며 문제가 없습니다.)
일반적으로 내부 기능은 이전 수준 또는 전역 수준에서 변수에 액세스 할 수 있습니다. 따라서 일부 사람들은 이것을 이해합니다. 폐쇄를 통해 로컬 기능 내 변수에 대한 외부 액세스가 달성 될 수 있습니다.
(우리가 단순히 범위를 한 레벨로 나누면, 정의 된 기능 본문 내부 스코프가 두 번째 레벨이고, 정의 된 기능 본문 내부 스코프가 제 3 레벨 등으로 중첩되는 첫 번째 레벨로 글로벌 범위를 가정하면 전통적인 의미에서, 제 1 레벨은 두 번째 레벨 변수에 액세스 할 수없고, 제 3 레벨은 액세스 할 수 없다. 이 레벨의 범위는 첫 번째 레벨 범위를 통해 제 2 레벨 범위의 변수를 참조 할 수 있으며,이 방법은 제 2 레벨 범위로 제 3 레벨 범위를 사용하여 기능 참조를 반환하는 것입니다. GC는이 체인에 의해 재활용되지 않는다.
함수 a () {var i = 0; 함수 b () {alert (++ i); } 반환 b; } var c = a (); 기음();즉, 폐쇄의 기능은 A가 실행되고 반환 된 후, 폐쇄는 JavaScript 쓰레기 수집 메커니즘 GC가 A가 차지하는 자원을 복구하지 않는다는 것입니다. A의 변수에 의존해야하기 때문입니다.
폐쇄의 존재로 인해, 기능 후 반환 후, 나는 항상 존재한다. 이런 식으로, c ()가 실행 될 때마다 1을 추가 한 후에 경고 한 값입니다.
그런 다음 A가 함수 B를 반환하지 않으면 상황이 완전히 다릅니다. A가 실행 된 후 B가 A의 외부 세계로 반환되지는 않지만 A에 의해서만 참조되므로 현재 A는 B에 의해서만 참조되므로 기능 A와 B는 서로 참조되지만 외부 세계에서 방해받지 않지만 (외부 세계에서 언급) 기능 A와 B는 GC에 의해 재활용됩니다.
실제로 변수의 수명주기를 연장하는 것은 폐쇄입니다. 일반적으로 함수의 범위, 즉 변수는 함수가 실행 된 후에 파괴되지만 함수가 폐쇄를 반환하면 폐쇄가 해제되지 않는 한 전체 스코프 체인이 메모리를 차지합니다. (클로저는 변수의 수명주기를 연장하는데, 이는 첫 번째 레벨에서 참조되는 경우를 나타냅니다. 그러나이 참조가 없으면 폐쇄를 여전히 폐쇄라고 할 수 있습니까?)
스코프 체인에 대해 말하면 : 즉, 함수 자체의 범위, 이전 레이어의 함수 범위 및 글로벌 범위. 변수에 액세스 할 때는 전 세계까지 레이어별로 레이어를 찾으십시오. 아직 없으면 오류를보고합니다.
(폐쇄의 범위 체인이 구부러 졌다고 불평하고 싶습니다.)
추신 : 일부 네티즌은 자바 스크립트 폐쇄의 개념을 분석하기 위해 다른 기사를 추천했습니다. 권위가 있습니까? 마지막으로 분명한 개념이 있습니다.
너무 많이 말하면 정확히 폐쇄는 무엇입니까? 아래에 요약하겠습니다.
클로저는 기능 실행이 해제 된 후 메모리가 상상하는 현상을 설명하는 개념입니다. 이 핵심 개념을 파악하는 한 폐쇄는 이해하기 어렵지 않습니다.
위의 기사에서는 한 문장으로 폐쇄를 이해할 수 있습니다 (간단하고 이해하기 쉬운)은 내가 공유하는 모든 내용입니다. 나는 당신이 당신에게 참조를 줄 수 있기를 바랍니다. 그리고 당신이 wulin.com을 더 지원할 수 있기를 바랍니다.