,如果我這樣做:使用Javascript - 運行時的優先級和隊列
setTimeout(function(){ alert('antani'); },400);
setTimeout(function(){ alert('supercazzola'); },400);
爲什麼這個腳本生成這兩個超時之間的隊列?
他們不應該在同一時刻提醒嗎?
正如我所看到的那樣,首先執行第一個警報,然後執行第二個警報。
,如果我這樣做:使用Javascript - 運行時的優先級和隊列
setTimeout(function(){ alert('antani'); },400);
setTimeout(function(){ alert('supercazzola'); },400);
爲什麼這個腳本生成這兩個超時之間的隊列?
他們不應該在同一時刻提醒嗎?
正如我所看到的那樣,首先執行第一個警報,然後執行第二個警報。
背景
JavaScript有隻有解釋器正在運行的一個線程。這意味着事件不會在同一時間處理。當你設置一個超時時,你實際上訂閱瀏覽器的一些內部事件,每次瀏覽器處於空閒模式時(當不忙於渲染,解析或執行某些腳本等)時觸發該事件。此事件的處理程序以及計劃的時間將根據腳本中顯示的訂單setTimeout
發佈到隊列中。每當這個內部事件被觸發時,瀏覽器檢查每個處理程序,並決定是否執行並從隊列中刪除它或跳過它。
同一時間
當您計劃任務之一,先後與同一估計時間
setTimeout(function(){ $('.element').hide(); },400);
setTimeout(function(){ $('.element').show(); },400);
的.element
將首先被隱藏,然後顯示。請注意,這並不意味着瀏覽器在隱藏後會將更改顯示爲.element
。大多數瀏覽器只會在腳本執行完成後渲染。
不同時間
當您計劃任務,不同的估計時間:
setTimeout(function(){ $('.element').hide(); },401);
setTimeout(function(){ $('.element').show(); },400);
結果可能是不可預測的。可能會出現以下情況:
更多或等於400
且小於401
毫秒過去了,瀏覽器開始處理事件處理程序。在這種情況下,.element
將首先顯示,然後隱藏。請注意,在400
毫秒之後可能會有其他setTimeout
計劃執行,並且它們將在隱藏.element
之前運行。
在第一次開始處理事件處理程序之前,瀏覽器忙於401
毫秒或更長時間。在這種情況下,最有可能(取決於瀏覽器實現).element
將首先被隱藏然後顯示,儘管根據估計時間它應該反之亦然!
關於你的問題:是它與同一時間或一些積極三角洲答案是NO 設置超時相同。這是不一樣的,當你用增量設置超時時,它們之間總有可能會處理另一個事件或超時。
請閱讀:http://ejohn.org/blog/how-javascript-timers-work/
這裏有一個類似的例子:
功能(){
var num = 5;
console.log(++num);
setTimeout(a, 100);
};
setTimeout(a,2000);
按照時間順序:
要定義函數,而無需調用它
你正在調度一個兩秒後調用:setTimeout的(一,2000)
它被稱爲
當經過100毫秒
調用時,它的時間表本身調用您的代碼基本上睡2秒鐘,然後執行一個有100毫秒的暫停[*]。
但是通過您的上下文判斷你所要求的是在下列情況下的優先級:
setTimeout(a, 2000);
setTimeout(b, 100);
那麼,最有可能的B將被首先調用(假設第一線和第二線之間不存在不可預知的停頓,例如由於整體OS性能問題)。
如果使用相同的超時:
setTimeout(a, 100);
setTimeout(b, 100);
一個將最有可能首先被調用。但是我不認爲這是有保證的,取決於JS引擎(是否使用了即將發生的事件嚴格的FIFO列表,什麼是內部時鐘分辨率等)
試試看:http://www.w3schools.com/js/tryit.asp?filename=tryjs_timing1 – WheretheresaWill 2013-04-24 10:37:11
@Wheretheresa將會發生同樣的超時衝突,並且只執行第一次超時,但是爲什麼:) – sbaaaang 2013-04-24 10:38:40
不,他們兩者都爲我執行。 – WheretheresaWill 2013-04-24 10:43:33