찾다

 >  Q&A  >  본문

javascript - setTimeout 문제

기능 테스트() {

으아악
某草草某草草2810일 전575

모든 응답(3)나는 대답할 것이다

  • 仅有的幸福

    仅有的幸福2017-06-14 10:55:57

    먼저 자바스크립트에 관한 글을 읽어보는 것을 추천합니다
    자바스크립트 이벤트 루프 작동 메커니즘에 대한 자세한 설명

    이 글에서는 JavaScript 이벤트 폴링의 원리를 자세히 설명합니다

    주제의 질문에 대해 이야기해 봅시다:

    1. 메인 스레드가 먼저 실행됩니다. test()가 실행되면 두 개의 setTimeouts가 동시에 작업 대기열에 들어간 다음 경고(0)가 실행되므로 이때 0이 먼저 출력됩니다. setTimeout이 아직 실행되지 않았으므로 a의 값은 19입니다. a에 대한 다른 할당 기회는 없습니다.

    2. 메인 스레드가 실행된 후 예약된 작업을 실행하기 위해 작업 대기열을 폴링합니다. 첫 번째 setTimeout 시간이 두 번째 시간보다 짧기 때문에 이때 첫 번째 setTimeout 콜백이 먼저 실행됩니다. 약 1초 후에 출력됩니다. 그러면 a에는 5라는 값이 할당됩니다.

    3. 그런 다음 두 번째 setTimeout을 실행합니다. 두 setTimeout이 동시에 대기열에 추가되므로 약 2초 후에 두 번째 setTimeout의 콜백이 실행되며, 이전 단계에서 얻은 5가 출력됩니다. 그러면 할당된 값은 4가 됩니다. 2초 정도 나오는 이유는 자바스크립트 타이머가 정확하지 않기 때문입니다

    회신하다
    0
  • 三叔

    三叔2017-06-14 10:55:57

    직접 디버그를 통해 메커니즘을 더욱 철저하게 이해할 수 있습니다

    회신하다
    0
  • 漂亮男人

    漂亮男人2017-06-14 10:55:57

    첫 번째 타이머가 실행된 후 전역 a는 5가 됩니다.
    테스트 함수에서 a의 변화: 1-19-5-마지막 경고(a)-4

    회신하다
    0
  • 취소회신하다