setInterval(function(){console.log("hello")},2000);
while(true){}
「hello」永遠不會被打印。 我認爲事件循環運行在不同的線程中,但在這裏看起來像'while循環'阻止了'事件循環'的執行。 有人可以對此有所瞭解嗎?
我對js非常天真,所以如果問題太單調太對不起。js while(true){} blocks event loop
setInterval(function(){console.log("hello")},2000);
while(true){}
「hello」永遠不會被打印。 我認爲事件循環運行在不同的線程中,但在這裏看起來像'while循環'阻止了'事件循環'的執行。 有人可以對此有所瞭解嗎?
我對js非常天真,所以如果問題太單調太對不起。js while(true){} blocks event loop
你必須明白
如何瀏覽器內部做的setTimeout?
我會簡單介紹一下。
要了解更多關於這個
這裏是jsconf2014
Philip Roberts: What the heck is the event loop anyway?
也由菲利普·羅伯茨 事件循環更detail explanation,看到這個過程中的行動是有偉大的工具看看 在loupe
要了解您必須瞭解JavaScript中的事件隊列。瀏覽器中實現了事件隊列。每當一個事件在js中被觸發,所有這些事件(比如點擊等等)都被添加到這個隊列中。當您的瀏覽器無法執行時,它會從隊列中取出一個事件並逐個執行它們。
現在,當您撥打setTimeout
或setInterval
時,您的回調將被註冊到瀏覽器中的計時器,並在給定時間過期後被添加到事件隊列中,並最終由JavaScript從隊列中取出事件並執行它。
發生這種情況,因爲JavaScript執行是單線程,他們一次只能執行一件事。所以,他們不能執行其他的JavaScript並跟蹤你的計時器。這就是爲什麼這些定時器在瀏覽器中註冊(瀏覽器不是單線程),它可以跟蹤定時器並在定時器到期後在隊列中添加一個事件。
只有在這種情況下,該事件纔會在指定的時間間隔內一次又一次地添加到隊列中,直到它被清除或刷新瀏覽器頁面爲止,纔會發生setInterval
。
注意
傳遞給這些函數的延遲參數是最小延遲時間 執行回調。這是因爲在定時器到期之後,瀏覽器將該事件添加到隊列中以由 javascript引擎執行,但執行回調取決於隊列中的事件位置,並且由於引擎是單線程的,因此 將執行隊列中的所有事件一個接一個。
因此,當您的其他代碼阻塞線程並且沒有時間處理隊列中的內容時,您的回調可能需要超過指定的延遲時間。
正如我所說的JavaScript是單線程。所以,如果你長時間阻塞線程。
這樣的代碼
while(true) { //infinite loop
}
您的用戶可以得到一個消息,說頁面不響應。
而在這裏,您的setTimeout
事件將永遠不會執行。
JS是單線程的。 –
我意識到我是一個業餘愛好者,但我一直在使用和編寫JavaScript一段時間,而我從來沒有見過使用'while(true)'的理由,while(variableName){if(東西){variableName = false; }'有它的用途,但不是一個不可避免的無限循環,據我所知... –
@DavidThomas'while(true)'肯定有它的用處:當你沒有明確的條件變量,當你需要重複,直到發生/完成/等。一個簡單的例子:https://pastebin.com/qEeuUxAs – zerkms