2012-10-24 90 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被執行?不應該假設每1秒執行一次setInterval,其他任何事情都不能執行? (上面的代碼是按照寫入順序運行的嗎?) 謝謝。

+0

所有代碼都馬上運行。 – Esailija

+0

立即返回編號'setInterval'和'setTimeout',並繼續您的功能。其他代碼的執行將在稍後超時到期以執行您提供給這些調用的代碼時中斷。 – sje397

+2

@ sje397正在運行的代碼不會被暫停。相反,如果javascript正在運行,那麼定時事件會被延遲。 –

回答

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 

希望這清除了你的困惑。

相關問題