출력은 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);
위 문제가 해결되면 문제가 없습니다
계속 변경하세요
으아아아
PHPz2017-05-19 10:35:22
먼저 루프 본문에 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
함수에 매개변수로만 전달됩니다. #🎜🎜#高洛峰2017-05-19 10:35:22
첫 번째 질문, 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가 계속해서 출력됩니다
滿天的星座2017-05-19 10:35:22
clearTimeout(timer)
이후에 모든 setTimeout
이 실행되기 때문에 다섯 번째가 지워졌습니다. setTimeout
是在clearTimeout(timer)
之后才开始执行的,已经把第五个清除掉了。
最后那个是因为while
执行的时候j
是0
,所有的setTimeout
都是延迟0
while
이 실행될 때 j
가 0
이고 모든 setTimeout
이 지연됩니다. 0
이후에 실행이 시작됩니다. #🎜🎜#迷茫2017-05-19 10:35:22
첫 번째에 답해 보겠습니다. setTimeout이 비동기적으로 실행되므로 ClearTimeout(timer)이 첫 번째 타이머를 지웁니다. 즉, i=0이면 경고가 나오지 않고, j는 j++를 실행하지 않았으며, j는 여전히 0입니다. 1초 후에 타이머가 다시 생성됩니다. 이때 i=1,j=0입니다. 이후의clearTimeout(timer)이 동기적으로 실행되므로 타이머는 더 이상 지워지지 않으므로 현재 결과를 볼 수 있습니다