javascript - js 비동기 문제, settimeout 문제
伊谢尔伦
伊谢尔伦 2017-05-19 10:33:22
0
5
661
으아아아

출력은 1,2,3,4 입니다
5는 왜 출력되지 않나요? 그리고 왜 이렇게 출력되나요? 매번 값을 할당하고 덮어쓰지 않나요? 왜 아직도 실행되고 있습니까? 순서는 무엇입니까? ClearTimeout 문은 언제 실행되나요? 약간만 변경하면
var i = 0, 타이머, j = 0;
while(i++ < 5) {
timer = window.setTimeout(function(){
j++;
Alert( j);
}, i*1000);
}
clearTimeout(timer);
위 문제가 해결되면 문제가 없습니다
계속 변경하세요
으아아아

伊谢尔伦
伊谢尔伦

小伙看你根骨奇佳,潜力无限,来学PHP伐。

모든 응답(5)
PHPzhong

먼저 루프 본문에 5개의 타이머가 생성됩니다. 각 타이머에는 고유한 ID가 있으며, ID는 setTimeout 호출 시 반환되며 숫자 값입니다.
두 번째로 timer는 타이머 ID만 저장하고 타이머 ID를 수정하지 않으므로 루프가 종료되면 timer는 마지막 타이머 ID만 저장합니다. 어떤 과제를 다루는지 명확해야 합니다.
타이머의 함수는 clearTimeout이 실행된 후에 실행을 시작합니다. 그러면 마지막 타이머가 지워집니다. 다른 타이머는 평소대로 실행됩니다. setTimeout时被返回,是一个数值。
其次,timer只是保存定时器的ID,并不会修改定时器的ID,所以当循环结束时,timer只是保存了最后一个定时器的ID。赋值覆盖的是什么应该清楚了吧。
定时器里的函数是在clearTimeout执行完后开始执行的。所以最后一个定时器被清除。其它定时器照常执行。

最后那个,while执行的时候setTimeout里的函数并没有被调用,因此j++并没有执行,所以在循环体内j一直是0
注:匿名函数只是作为一个参数被传入setTimeout

마지막으로 while이 실행되면 setTimeout에 있는 함수가 호출되지 않아 j++가 실행되지 않으므로 본문의 루프 j는 항상 0입니다.
참고: 익명 함수는 setTimeout 함수에 매개변수로만 전달됩니다. #🎜🎜#
小葫芦

첫 번째 질문, i=4일 때 1초 후에 Alert(j==5)가 있어야 하지만 그 다음에는 즉시 ClearTimeout(timer)가 실행되어 Alert(j)를 취소합니다

두 번째 질문도 위와 같습니다

세 번째 질문, i=0, j가 0이면 경고 작업이 직접 실행될 것이라고 생각할 수 있지만 그렇지 않습니다. setTimeout(code, millisec)은 코드를 대기 대기열에 넣은 다음 실행합니다. 나중에 i=1일 때 j는 여전히 0입니다. 마찬가지로 i=2,3,4,5이므로 1234가 계속해서 출력됩니다

滿天的星座

clearTimeout(timer) 이후에 모든 setTimeout이 실행되기 때문에 다섯 번째가 지워졌습니다. setTimeout是在clearTimeout(timer)之后才开始执行的,已经把第五个清除掉了。

最后那个是因为while执行的时候j0,所有的setTimeout都是延迟0

마지막은 while이 실행될 때 j0이고 모든 setTimeout이 지연됩니다. 0 이후에 실행이 시작됩니다. #🎜🎜#
过去多啦不再A梦

잘보세요 while(i++ < 5) 왜 5를 출력할 수 없나요? 5보다 크지 않아서 출력되지 않습니다.#🎜🎜 #

迷茫

첫 번째에 답해 보겠습니다. setTimeout이 비동기적으로 실행되므로 ClearTimeout(timer)이 첫 번째 타이머를 지웁니다. 즉, i=0이면 경고가 나오지 않고, j는 j++를 실행하지 않았으며, j는 여전히 0입니다. 1초 후에 타이머가 다시 생성됩니다. 이때 i=1,j=0입니다. 이후의clearTimeout(timer)이 동기적으로 실행되므로 타이머는 더 이상 지워지지 않으므로 현재 결과를 볼 수 있습니다

최신 다운로드
더>
웹 효과
웹사이트 소스 코드
웹사이트 자료
프론트엔드 템플릿