2012-10-24 5 views
0

다음 코드는 1 초마다 날짜를 표시 한 다음 중지합니다.JavaScript setInterval 및 setTimeout

(function() { 
    var i = setInterval(function() { 
     console.log(new Date()); 
    }, 1000); 
    console.log("Hi"); 

    setTimeout(function() { 
     clearInterval(i); 
    }, 3000); 
    console.log("Hola"); 
})(); 

출력 :

Hi 
Hola 
Wed Oct 24 2012 13:35:27 GMT+0200 (CEST) 
Wed Oct 24 2012 13:35:28 GMT+0200 (CEST) 
Wed Oct 24 2012 13:35:29 GMT+0200 (CEST) 

그러나 HiHola가 먼저 표시되는 이유를 모르겠어요. 또한 setTimeout이 실행되는 이유는 무엇입니까? setInterval이 1 초마다 실행되고 다른 어떤 것도 실행될 수 있다고 가정하지 않습니다. (위의 코드는 작성된 순서대로 실행됩니까?) 고마워요.

+0

모든 코드가 즉시 실행됩니다. – Esailija

+0

아니요.'setInterval'과'setTimeout'이 즉시 반환되고 함수가 계속됩니다. 나중에 해당 시간 제한이 만료되어 해당 호출에 제공 한 코드를 실행하면 다른 코드 실행이 중단됩니다. – sje397

+2

@ sje397 실행중인 코드의 실행이 일시 중지되지 않습니다. 대신 자바 스크립트가 실행 중이면 시간 초과 이벤트가 지연됩니다. –

답변

3

setTimeout뿐만 아니라 setInterval는 함수 (콜백)를 등록하지만 다음 명령어로 바로 이동합니다.

따라서 첫 번째 콜백이 호출되기 전에 HiHola이 인쇄됩니다.

첫 번째 콜백은 1 초 후 setInterval이고 다시 2 초 후입니다. 3 초 후 setTimeout이 시작되어 setInterval이 삭제됩니다.

+0

그래서 그들은 핸들러와 비슷합니까? –

+2

@enrmarc 예. 시간이 지나갔다는 사실을 처리합니다. –

2

http://ejohn.org/blog/how-javascript-timers-work/

그 두 이벤트는 비동기. "setTimeout"또는 "setInterval"이 호출 된 정확한 시간이 아니라 다음 사용 가능한 순간에 대기/실행됩니다.

+0

링크를 제공해 주셔서 감사합니다. –

+0

위대한 링크. Upvoted. –

+0

나는 첫 번째 단락에서 두 번 세어 본 기사는 별도의 스레드에서 실행되지 않는다고 말했습니다. – sje397

4

주석은 실행 순서이이 혼란을 정리할

(function() {       // 0 anonymous function is called inline 

    var i = setInterval(function() { // 1 setInterval **schedules** the function 
             //  parameter to be executed every second 
     console.log(new Date()); 
    }, 1000); 
    console.log("Hi");     // 2 Display 'Hi' on console 

    setTimeout(function() {    // 3 **Schedule** the function parameter to 
             //  execute after three seconds 
     clearInterval(i);  
    }, 3000); 
    console.log("Hola");    // 4 Display 'Hola' on console 
})(); 

             // 5 Display date from setInterval function 

             // 6 Display date from setInterval function 

             // 7 Display date from setInterval function 

             // 8 Cancel setInterval executed from 
             //  setTimeout function 

희망을 보여줍니다.

관련 문제