2014-01-26 3 views
1

자바 스크립트 클로저에 대한 기본적인 지식이 아직 없습니다. http://jsfiddle.net/nAh8x/자바 스크립트 클로저 이해하기 - 콜백에 전달 된 변수 고정하기

코드 :

카운트 1 ~ 3 3 초 여기

참조 JSFiddle에 :

나는 아마 또한 기본 및 일반적인 예는 특정 상황에 대한 질문이 있습니다 :

var i, 
    t; 

t = 0; 

// Case A 

for(i=1; i<=3; i++) { 
    setTimeout(function() { log(i); }, t); 
    t += 1000; 
} 

// Case B 

for(i=1; i<=3; i++) { 
    setTimeout(wrapper(i), t); 
    t += 1000; 
} 

function wrapper(i) { 
    return function() { log(i); }; 
} 

// Log utility function 

function log(msg) { 
    $('#log').append(msg + '<br />'); 
} 

사례 이 작동하지 않습니다.

그것은 왜 나에게 분명하다 : 내부 함수가을의 setTimeout 때마다 호출되고 내가 변수 액세스는, 그 값은 이미 케이스 B 작품 4.

에 도달했습니다. 래퍼 (I)가 그것이라고

function() { log(i); }; 

복귀하고 상기 리턴 값 (함수) 내부의 setTimeout 진행하는 것이다. 무엇에서는 setTimeout 내부에가는 것은 정확히 케이스

그러나이 시간과 동일의 내가 변수는 호출시의 값으로 "고정"이었다.

래퍼 함수를 사용하면 전달 된 값을 고정시킬 수 있습니까?

그건 완전히 명확하지 않습니다.

+0

파울로, 나는 불친절하고 싶지 않지만 시작 진술은 수정해야합니다. 읽어야합니다, "나는 * 아직 자바 스크립트 클로저에 대한 기본적인 지식을 가지고 있지 않다." 여러분이 고심하고있는 것은 기본 개념입니다. 즉, 클로저가 로컬 변수를 트랩하고 외부 함수가 완료되고 반환 된 후에도 내부 변수가 자유 변수에 액세스 할 수있게합니다. 이를 위해 내부 함수에 대한 지속적인 참조가 있어야합니다 (예 : 반환 된 함수 할당). –

+0

나는 당신과 동의한다 – Paolo

+0

Paulo, 아마 나는 약간 불친절했다. 그러나 당신은 턱에 그것을 가져 갔다. –

답변

1

래퍼 함수의 로컬 범위는 i입니다.

이 때 wrapper이 호출 될 때 값이이고 다른 i이 수신됩니다.

당신이로 재 작성하는 경우 그것은 명확 수 있습니다 :

function wrapper(notI) { 
    return function() { log(notI); }; 
} 
1

wrapper 내에서 사용되는 변수 iwrapper의 형식 매개 변수의 (a 사본 등)에 전달 된 하나입니다. for 루프 안에있는 것과 같은 i이 아닙니다. 원하는 변수로 이름을 바꿀 수 있으며 코드는 여전히 작동합니다.

원래 wrapper이 호출 될 때마다 값을 가지고 있기 때문에 멈췄습니다.

1

클로저 외부 함수를 호출하여 변수 범위와 중첩 함수로 생성되는 환경,

아래 각 다른 환경이 만든 것 wrapper()가 호출 될 때마다 여기

function wrapper(i) { 
    return function() { log(i); }; 
} 

함수

이다 인 i의 값은 wrapper()이 호출 될 때와 같을 것입니다. 때마다 i의 값은 wrapper() 외부 함수를 호출하여 만든 특정 환경에 대해 비공개입니다.

관련 문제