2016-01-18 136 views
3

假設我有這樣的代碼:DOM事件的優先級隊列

$('button').click(function onClick() { 
    $('#divResult').text(Math.rand()); 
}); 

setInterval(function timeout() { 
    console.log("Hello"); 
}, 300); 

setInterval(function timeout() { 
    console.log("Hi"); 
}, 200); 

setInterval(function timeout() { 
    console.log("Yo!"); 
}, 100); 

所以基本上,300毫秒後,我會在事件隊列超過1個回調函數。現在,讓我們說一段時間後,用戶點擊一些東西。這個點擊事件得到處理,onClick()回調函數也進入事件隊列中。假設第一次到達那裏,已經有兩個由setInterval創建的回調函數。由於這是一個與DOM相關的函數,它將重新渲染窗口,它會優先於這些函數嗎?

this talk on event loops中,作者提到了一個渲染隊列,該渲染隊列優先於回調隊列(通過setTimeout和setInterval之類的方法進行回調)。由於onClick()執行與渲染相關的事情,它會進入這個隊列還是進入常規回調隊列並等待輪到?

+0

「*在這個關於事件循環的討論中...... *」 - 說什麼? – Amit

+0

@Amit對不起,我忘了添加鏈接。固定。 – daremkd

+0

我不記得在任何規範或MDN(「聖經」)中提到過任何類似的東西。我假設即使存在這樣的事情,它也會依賴於實現。但我不知道這個確實... – Amit

回答

0

嗯,我想我會給它一個鏡頭,但這個信息對我來說也是很新的。

由於這是一個與DOM相關的函數,它會重新渲染窗口,它會優先於這些函數嗎?

不,我不認爲這個函數本身比這些區間內的函數更有優先權。我不認爲瀏覽器本身會知道點擊回調實際上會改變DOM。回調函數運行並且元素的文本發生更改後,瀏覽器會在有機會時重新繪製該節點。

由於onClick()會執行與渲染相關的事情,它會進入此隊列還是進入常規回調隊列並等待輪到?

我不相信onclick處理程序必須做任何與渲染相關的事情。是的,我們大部分時間都是編碼的,但我不認爲它總是要改變一個元素的外觀。它只能在後臺發送Ajax請求。它可以只是登錄到控制檯。你永遠不知道。

另請注意,setInterval不會將事件添加到事件隊列中以在稍後的特定時間執行。它等待一段時間,然後將該事件添加到事件隊列中。您可以閱讀更多關於here的信息。

希望我沒有自欺欺人,因爲直到幾個月前我才真正深入JS。如果我關閉了任何事情,請告訴我。