자바 스크립트 클로저에 대한 기본적인 지식이 아직 없습니다. 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 내부에가는 것은 정확히 케이스
그러나이 시간과 동일의 내가 변수는 호출시의 값으로 "고정"이었다.
왜 래퍼 함수를 사용하면 전달 된 값을 고정시킬 수 있습니까?
그건 완전히 명확하지 않습니다.
파울로, 나는 불친절하고 싶지 않지만 시작 진술은 수정해야합니다. 읽어야합니다, "나는 * 아직 자바 스크립트 클로저에 대한 기본적인 지식을 가지고 있지 않다." 여러분이 고심하고있는 것은 기본 개념입니다. 즉, 클로저가 로컬 변수를 트랩하고 외부 함수가 완료되고 반환 된 후에도 내부 변수가 자유 변수에 액세스 할 수있게합니다. 이를 위해 내부 함수에 대한 지속적인 참조가 있어야합니다 (예 : 반환 된 함수 할당). –
나는 당신과 동의한다 – Paolo
Paulo, 아마 나는 약간 불친절했다. 그러나 당신은 턱에 그것을 가져 갔다. –