이 문제를 해결하는 표준 방법은 공장 기능을 사용하는 것입니다 : 각 호출에 대해 i
의 현재 값을 전달해야 source
루프에서이
, 우리 전화makeResponder
, 그리고 그것을 (index
)에 전달 된 인수보다는 i
변수를 통해 닫 함수를 반환합니다. (중요합니다. 익명 함수에서 i
인수를 제거한 경우 코드가 부분적으로 작동하지만 처음 예약되었을 때가 아니라 이으로 실행될 때 모든 함수의 값이 i
으로 표시됩니다. 귀하의 예를 들어, 그들은 모두 8
볼 것)
업데이트을 아래에 귀하의 의견에서 :.
... 난 그런 식으로 setTimeout(makeResponder(i),i*800);
에 전화를하는 경우가 올바른 것인가?
당신의 목표는 각 호출을하는 경우 예, 나중에 마지막으로보다 800ms, 즉 작동 거의 발생합니다
Live example을 |
source 나는 setTimeout(makeResponder(i),setInterval(i));function setInterval(index) { console.log(index*800); return index*800; }
을 시도했지만 제대로
당신은 setInterval
그런 식으로 사용하지 않는 작동하지, 그리고 아마 모든이를 위해 그것을 사용하지 않습니다.
는 또한 갱신 :
내가 첫 번째 반복 인쇄 8 지연 8 초, 두 번째 반복 인쇄 7 초 ........ 인쇄 (7) 지연이 필요합니다 : 당신은 아래 말한 2 지연 2 초 ... 인쇄 0 지연 0 초.
당신은 단지 두 번째 시간 제한 사용하여, 위의 다시 원칙을 적용
var end=8;
for (var i = 1; i < end; i ++) {
setTimeout(makeResponder(i), i * 800);
}
function makeResponder(index) {
return function() {
var thisStart = new Date();
console.log("index = " + index + ", first function triggered");
setTimeout(function() {
console.log("index = " +
index +
", second function triggered after a further " +
(new Date() - thisStart) +
"ms delay");
}, index * 1000);
};
}
Live example을 | source
이제는 앞으로해야 할 모든 도구가 있다고 생각합니다.
맞습니까? 오류가 있습니까? – Starx
문제는 범위 문제입니다 :'for' 카운터 변수는'i'라고하지만, 매개 변수는'i'라고합니다. 따라서 매개 변수 -i 범위에있는 즉시 counter-i에있는 모든 값을 덮어 씁니다. 카운터 또는 매개 변수의 이름을 변경하면 도움이됩니다. –
@DominikSchreiber : 부분적으로 * 범위 문제입니다. 그러나'i' 인수를 제거하거나 이름을 바꾸는 것으로는 해결되지 않습니다. –