2011-06-07 51 views

回答

1

對於大部分時間瀏覽器執行線程爲空閒,沒有運行任何代碼。當您使用setTimeout註冊某個要執行的函數時,它將在給定的毫秒數之後執行。

現在:如果在給定的時間量之後執行一些其他代碼(如事件處理程序或長循環),則瀏覽器工作線程正忙,您的功能將不得不等待。考慮以下代碼:

setTimeout(f, 500); 
for(var i = 0; i < 10000000; ++i){ 
    //... 
} 

setTimeout立即返回,允許執行循環。如果此循環運行時間超過500毫秒,則不會中斷,您的功能將不得不等待。如果在例如之後也會發生同樣的事情490毫秒觸發一些冗長的事件處理程序。

將瀏覽器JS工作線程視爲一個消費者和多個生產者的隊列。隊列中的某些項目可以立即拿起(如事件處理程序),有些項目必須等到其超時過期。

0

也許我不明白這個問題..但這是直接從window規範。

的setTimeout(函數,毫秒) 此方法調用的 毫秒經過指定次數後該函數一旦 ,直到通過向clearTimeout呼叫取消 。方法 返回一個timerID,可用於 後續調用clearTimeout到 取消間隔。

Reference

基本上功能你指定已通過毫秒的量之後被調用。

1

Javascript是單線程的,並運行一個調用堆棧,它基本上是先到先得的處理。

setInterval和setTimeout函數在提供的持續時間結束後將傳遞的函數放入調用堆棧中。這裏的區別在於結果不是在那個時候執行的,它們只是放在調用堆棧中,所以如果某個東西已經在運行,它將不會執行你在超時時提供的函數,直到你完成。

例如:

var i = 0; 
setTimeout(function() { i = 1; }, 10); 
for (; i < 1;) {} 

你永遠不會離開,對於循環,即使10毫秒之後,功能設置我到1被調用,它只是在調用堆棧,並且不會在for循環完成之前生效。

相關問題