폐쇄의 작은 이해

우리는 먼저 폐쇄하기 전에 대략적인 범위를 논의해야

런타임 코드의 모든 라인은 변수를 저장하는 규칙의 "잘 설계된 세트의 범위에 설명되어있는"당신이 모르는 자바 스크립트 "의 범위가있을 것입니다, 그리고 당신은 쉽게 이러한 변수를 찾을 수 있습니다.이 규칙 그것은 범위라고합니다. " 그것은 단지에 변수 현재 액세스 내부에 저장되고,이 변수에 저장되어 어떤 형태로는, 찾고 때 어떻게 찾을 수 있나요? JS 중지 범위 체인의 필요성이 변수를 사용할 때, 그는 당신이 변수를 찾거나 최 외층 (전역 변수)에 도달 할 때까지 범위 체인 아래로 수준을 찾을 수가있다, 우리는 코드를 사용 설명하기.

함수 foo는 (a) {    
  CONSOLE.LOG (a + b); 
} 
 
var에 B = 2 ; 
 
foo는 ( 2); //   4

행 범위 체인 VAR의 B = 2를 수행 할 때 내부 foo 함수를 수행 할 때, 단지 전역 변수를 포함하며 선단 측으로 밀려에서, 현재 변수 복사본 상위 범위 체인 사물

B = 미정   

 

VAR B = 2 범위 체인  

 

A = 2
B = 2

 

 

함수의 foo 안쪽 범위 체인을 수행 할 때

의는 블록 레벨 범위 JS에 대해 얘기하자

JS 기능은 우리가 범위를 필요로 할 때, 우리는 우리가 함수를 생성하고 그 실행, 우리는 기능을 실행할 때 종종 이름으로 함수를 호출 할 수 있으며, 새로운 글로벌 변수가 환경을 오염 만들려하지 않는 범위에서 생성 될 수있다 우리 단지에있는 경우 환경을 오염 할 함수 이름의 범위, 함수 이름을 만들고, 우리는 즉시 기능을 실행, 즉 익명 함수를 작성하고 예제를보고 즉시 그에게 전화 도움이 필요

// 일반 함수 
함수 FN (A) { 
 CONSOLE.LOG (A) 
} 
FN ( 2 ) 


// 즉시 실행 기능 
( 기능 (A) { 
 CONSOLE.LOG (A) 
}) ( 2)

 

이후 함수 () {} ()는 표현은,이 즉시 실행 기능 필요한 에러 () 익명 함수 랩 생산 (함수 () {}) ()이 함수는 즉시 실행되는 방법 및 일반적인 함수 또한 대량 참여 할 수있다

 

 

여기에서 우리는 폐쇄에 대해 이야기 항목을 입력

클로저는 변수가 내부 함수입니다 액세스 할 수있는 외부 함수의 표현이다 우리 크로스 액세스 변수 범위를 만들 수 있습니다, 우리는 예를 살펴

함수 foo는 () {   
     var에 A = 2 ; 
    기능 바 () {          
         CONSOLE.LOG (a);    
    } 
    반환 줄; 
 } 
 
VAR의 바즈 = foo는 (); 
 
바즈 (); // 2

 

이 간단한 폐쇄하고, 내부 변수는 함수 foo이 경우 정상적인 상황에서 액세스 할 수없는 변수가 있었지만, 우리는 그 내부에 함수를 작성하고 함수가 반환 내부 변수를 얻을 수 있습니다, 당신은 얻을 수 있습니다 이 내부 변수는, 단지 폐쇄를 보여 물론, 이것이이 기능은 실질적인 의미가 없습니다.

우리의 다른 증상은 루프에 대한 가장 고전의 폐쇄를 보면

기능 수 () {
     var에 도착 = [];
    위한 ( VAR I = 1; i가 <= 3, i가 ++ ) { 
        arr.push ( 함수 () { 
             CONSOLE.LOG (I) 
        }); 
}
반환 편곡을; } VAR의 결과 = 횟수 (); VAR의 F1 = 결과 [0 ]; VAR의 F2 = 결과 [1 ]; VAR의 F3 = 결과 [2];
F1 ();
F2 ();
F3 ();

 

함수는 계수 배열을 반환 어레이는 세 가지 요소, 즉 세 가지 기능은 원하는 F1 (), F2 (), F3 ()로서, 1,2,3- 인쇄해야이 있지만, 그 결과는 세 인쇄 4

For 루프가 완료된 후에 때의이 분석 익명 함수의 범위 체인 변수 i가 존재한다는 것을 의미한다 루프 어레이, 외부 변수 I에 사용이 익명 함수에 익명 함수 밀어하자 우리는 () 익명 함수라고하며, i는 범위 체인을 I를 찾아 찾아거야 이때 함수 ​​(F1)를 호출 할 때, 이번에는 4, 이입 (F2) (F3)이다 발견 4진다 () 4이를 출력한다.

난 익명 함수의 범위 체인을 증명하기 위해주기 변화로, 우리는 할 수 있습니다

기능 수 () {
     var에 도착 = [];
    위한 ( VAR I = 1; i가 <= 3, i가 ++ ) { 
        arr.push ( 함수 () { 
             CONSOLE.LOG (I) 
        }); [도착
         0 ] () 
    } 
    리턴 도착; 
} 
수 () // 1 2 3

위의 통해 우리는 분명히 내가 루프 변수 범위 체인의 과정에 있던 익명 함수 익명 함수가 호출 될 때 내가 끝나지 않는 루프를 추가하기 전에 한 번주기를이 변수를 찾아 갈 것을 볼 수 있습니다.

그러나, 우리는,주기 변경에 대한 변경없이,이 난을 저장할 종종 우리가 원하는 결과가 아니다 그래서주기위한 세 가지 익명 함수의 범위 체인, 난 더 이상 지점이 내가, 우리 나는 모양을 변형시키는 위의 기능을 즉시 실행을 소개 할 수있는 당신은, 내가이 유지됩니다 블록 수준 범위를 만들 수 있습니다

기능 수 () {
     var에 도착 = [];
    위한 ( VAR I = 1; i가 <= 3, i가 ++ ) { 
       ( 함수 (I) { 
           arr.push ( 함수 () { 
               CONSOLE.LOG (I) 
           })] 
       }) (I) 


    } 
    리턴 도착; 
} 

VAR의 결과 = 횟수 ();
VAR의 F1 = 결과 [0 ];
VAR의 F2 = 결과 [1 ];
VAR의 F3 = 결과 [2 ]; 
F1 (); 
F2 (); 
F3 ();

각각의 사이클이 과정은 즉시 새로운 집행 기능을 가지고 있고, 발견 할 것이다 익명 기능 ARR 수행 할 때 즉시 각 기능은 다른 I를 저장하기 위해 새로운 영역을 만들어 수행합니다 난 (I 저장 될 수있는 값 전송의 함수 값에 의해 전달) 보존.

위의 방법은 우리가 새로운 무기하자가 지금 같은 범위를 해결하는 전통적인 방법이다, (다른 특성이이 적용되지 않을 수 있습니다) 변수 선언이 자동으로 범위를 생성 할 수 있도록, 그리고 지금 우리가 얻을 수하도록 할 수 있습니다 효과는 각 익명 함수 편곡에 대한 새 범위를 만들

기능 수 () {
     var에 도착 = [];
    위한 ( 하자  된 I = 1; i가 <= 3, i가 ++ ) { 
        arr.push ( 함수 () { 
             CONSOLE.LOG (I) 
        }); 

    } 
    반환 편곡을; 
} 

VAR의 결과 = 횟수 ();
VAR의 F1 = 결과 [0 ];
VAR의 F2 = 결과 [1 ];
VAR의 F3 = 결과 [2 ]; 
F1 (); 
F2 (); 
F3 ();

 

추천

출처www.cnblogs.com/Qqqing/p/11626934.html