잘못 폐쇄는 폐쇄 야한 세션의 얼굴 명중

저자 : HerryLo

원래 영구 링크 :  HTTPS : //github.com/AttemptWeb/Record ...

부끄러운, 그때 나는 내가 완전히 지금 실제로하지 않았다, 그리고 -ing 답변을 신속하게 책을 발견, 클로저를 이해하고 생각하기 전에, 실패 강제로로드, 오답입니다, 문제 폐쇄가 발생했습니다.

0,1,2을 인쇄하려면 다음 코드, 루프 배열 가져 오기 기능을 참조 바람직 할 수있다 :

함수 FUNC () {
     var에 도착 = []; 경우 ( VAR은 I = 0; I는 < 3; 내가 ++) { 도착. 푸시 (() => { 콘솔. 로그 (I)})} 리턴 도착} VAR 결과 = FUNC (); 결과. 대해 forEach (( 아이템) => { 항목 ()}) <! -打印信息三个3 -> // 3

난의 익명 함수는 동일한 어휘 범위를 공유하기 때문에 (3), 인쇄에서 발견된다. 익명 통화 기능 변수 어레이, 가변 블록 레벨 범위 VAR 선언이없는 경우, i 값은 루프의 마지막 포인트 I을 갖는다.

다음 코드를 해결, 위의 문제를 해결할 수있는하자 또는 폐쇄와 위의 문제를 해결 :

<! - 프로그램 ->
 // 것은하자하여 변수 선언 함수 FUNC를 () { var에 ARR은 = [] 에 대해 ( I에게하자 = 0; I는 < 3; I는. ++) { ARR. 푸시 (() => { 콘솔. 로그 (I);})} 반환 ARR} var에 결과 = FUNC (); 결과. 대해 forEach (( 항목) => { 항목 ();}) <! - 옵션 II -> // 사용 폐쇄 패키지 함수 FUNC () { var에 ARR = [] 대 ( VAR의 I = 0; I는 < 3].이 I ++) {( 함수 () { ARR.푸시 (() => { 콘솔. 로그 (I)})}) ()} 리턴 도착} VAR 결과 = 용 FUNC (); 결과. 대해 forEach (( 아이템) => { 항목 ()})

생각은 해결하고, 다른 질문을 생각했다! 위의 방식과 제 2 방식에서 실행할 수, 당신은 세 3에서 WT를 II 인쇄하는 옵션의 결과를 찾을 수 있나요? 당신은 0,1,2을 인쇄하지 말아야, 어떻게하지?

폐쇄 범위 체인

옵션 하나는 사용 범위가 문제를 해결하자, 물론 아무 문제가 없다. 두 번째 방식에서는 클로저의 사용은 i 변수의 범위의 문제를 해결하기 위해,하지만 효과 클로저를 보인다.

반응식 II 작용으로 폐쇄 폐쇄 범위 체인 저장 가변 민영화 제가 파괴되지 않고 가변적이다. 폐쇄 이해가 안 들어 범위는 후 유의 볼 수있는  깊이의 자바 스크립트 실행 컨텍스트  및  폐쇄 자바 스크립트의 깊이를 . 두 번째 방식은 우리가 원하는 결과가 아닌, 이유는 내가 인한 폐쇄의 범위를 이해하지 못하는 것입니다.

<! -方案三->
 함수 FUNC () { var에 도착 = []; 경우 ( VAR 난 = 0; i가 < 3; 내가 ++) {( 기능 ( ⅰ) { 도착. 밀 (() => { 콘솔. 로그 (I)})}) (I)} 리턴 도착} VAR 결과 = FUNC (); 결과. 대해 forEach (( 아이템) => { 항목 ()})

다음은 내가 옵션 II의 문제를 해결 익명 함수 매개 변수에 추가됩니다 솔루션입니다.

설명의 편의를 위해, 나는을 Fn1로 언급 실행 익명 함수가 될 것이며, 짧은 Fn2를 위해 익명 콜백 함수를, 언 :의 방법 문제에 대해 자세히 설명하겠습니다. 물론 세 가지 기능 ARR Fn2를 세 가지 다른 기능입니다.

함수 범위 체인

fn2函数作用域链 : {
    fn2函数变量和参数 , fn1函数变量&&参数 , func函数变量&&参数 , 全局作用域变量
}

이 기능을 Fn1 자체 실행 FUNC 함수를 호출 할 때 반환 밖으로, 언 동안, 변수는 편곡, 세 Fn2를 기능을 주입. 이때 폐쇄 범위 체인을 형성한다.

Fn2를 함수는 함수 FUNC 변수 I를 찾을 때까지 난 VAR 선언 때문에 난을 Fn1 기능이 때, 함수 및 Fn2를 I에 존재하지 않는 연속적으로 상방으로 배열 조회를 실행 블록 레벨 범위는 3 공유 기능 Fn2를 존재하지 내가. (사실,이 장소는 약간의 반복이며, 처음, 새로운 것의 출현을 설명하지만, 여기에 아마 폐쇄 범위 체인입니다).

일반적인 함수 호출되면 범위 체인은 파괴되지만, 폐쇄의 존재는 해당 범위 체인이 저장된다. 도착의 Fn2를 기능 영역은 기본적 쇄 영역을 형성하는 범위 체인은 단방향, 룩 업에 의해, 외부에 내부 본다. 범위 체인은 로컬 및 글로벌 변수, 함수 파라미터를 저장.

옵션 II 및 옵션 III 비교

//方案二
 함수 FUNC () { var에 도착 = []; 경우 ( VAR 난 = 0; i가 < 3; 내가 ++) {( 함수 () { 도착. 밀 (() => { 콘솔. 로그 (I)})}) ()} 리턴 도착} VAR 결과 = FUNC (); 결과. 대해 forEach (( 아이템) => { 항목 ()})

이제 옵션 II를 보면 첫째 자신의 기능 범위를 찾습니다 Fn2를 함수의 편곡 결과 호출을 가로 지르는 동안, 그것은 내가, 내가 그것을 밖으로 인쇄 할 기능 FUNC의 변수를 찾기 위해 찾아 계속 존재하지만,이 시간 FUNC하지 않습니다 함수는 세 개의 사이클, Fn2를 ARR의 세 가지 기능, 상기 문헌은 잉크 3 세 번 때문에 변수 i가 3과 동일 갖는다.

//方案三
 함수 FUNC () { var에 도착 = []; 경우 ( VAR 난 = 0; i가 < 3; 내가 ++) {( 기능 ( ⅰ) { 도착. 밀 (() => { 콘솔. 로그 (I)})}) (I)} 리턴 도착} VAR 결과 = FUNC (); 결과. 대해 forEach (( 아이템) => { 항목 ()})

옵션 3 년 : 결과 호출을 가로 지르는 동안, Fn2를 기능에 도착 먼저 자신의 기능 범위를 찾습니다, 그때 내가, 내가 인쇄 할을 Fn1 기능 매개 변수를 찾기 위해 찾아 계속 존재하지 않습니다. 세 익명 함수가 있기 때문에, 함수 매개 변수는 0, 1, 2입니다.

종료 : 클로저를 형성 할 때 여기 사실, 두 번째 계획의 기본 문제를 이해할 수있는, 사실, 문제 폐쇄 범위 체인은, 범위 체인에 관련된 폐쇄가 저장됩니다. 당신이 정말로 클로저를 이해한다면, 나처럼, 내가 문제를 만난 적이, 자신에게 교훈. 우리가 지적 할 수 있다는 희망을 쓸 수있는 나쁜 장소는 여기 기사에 대한 참조 링크입니다.

(위의 내용이 당신의 불편을 야기하는 경우, 당신은 후 유의 블로그를 참조 할 수 있습니다)

참고 기사 :

MDN 폐쇄

자바 스크립트 실행 컨텍스트의 깊이

폐쇄 자바 스크립트 깊이

추신 : 자신의 개인 공공 수를 밀어 방법 : Yopai, 우리는 시간에서 매주 업데이트 시간에 따를 수 있습니다 관심이 세상을 공유하는 즐거움을 증가시킬 수있다

추천

출처www.cnblogs.com/liuheng/p/11422417.html