我已經使用 JS 大約一年了,我仍在學習它。我的問題在最后。
在第一個例子中:
console.log('Start');
setTimeout(()=> console.log('inside callback'), 0);
console.log('End');
輸出
Start
End
inside callback
我知道即使超時是0,它仍然必須轉到瀏覽器 WebApi(setTimeout api)并立即推送到回呼佇列中等待主執行緒空閑(當前正在執行 console.log('End'))。一旦執行緒空閑,就會執行回呼并列印“內部回呼”。
按照這種方法,我嘗試使用另一個 WebAPI 進行試驗,即 DOM API。
這一次,我使用了 document.querySelectorAll() 而不是 setTimeout
console.log('Start');
console.log(document.querySelectorAll('img'))
console.log('End');
輸出
Start
NodeList(4) [img.bar-sm.-avatar.js-avatar-me, img.bar-sm.avatar.s-avatar--image, img, img]
End
這次我們在列印 END 之前看到了 DOM API 輸出。
我知道輸出,但我想了解它背后的流程。
為什么它不遵循像 setTimeout 這樣的模式?
如果 DOM 輸出是在單獨的執行緒上處理的,為什么 DOM 輸出沒有出現在“End”之后。
它是否遵循以下流程:
document.querySelectorAll -> webAPI -> 回呼佇列 -> 主執行緒
DOM API 是否必須通過回呼佇列并等待主執行緒為空。如果是這樣的話?與 setTimeout 不同的是,這次我們為什么以正確的順序獲得控制臺
我仍在學習,非常感謝解釋。如果我誤解了,請指出任何內容。謝謝。
uj5u.com熱心網友回復:
原因是document.querySelectorAll是同步方法,而setTimeout是異步方法。
JS 腳本在 DOM 所在的相同環境中執行,因此它不是異步的。異步事件是通常被發送到另一個環境的事件(稍后由事件回圈處理)
這是基于事件回圈的并發模型的一部分,它實際上負責執行代碼,收集和處理事件。setTimeout 函式使用 2 個引數呼叫:要添加到回呼佇列的訊息和時間值(可選;默認為 0)。時間值表示訊息實際被推送到佇列后的(最小)延遲。如果佇列中沒有其他訊息,并且堆疊為空,則在延遲后立即處理該訊息。但是,如果有訊息,則 setTimeout 訊息將不得不等待其他訊息被處理,因此,第二個引數表示最小時間(不是保證時間)。因此,在回呼“內部回呼”中的訊息被處理之前,訊息“結束”將被寫入控制臺,
document.querySelectorAll 是在 DOM 所在的同一環境中執行的腳本的一部分,因此它不是異步的,將立即執行。
DOM 操作是同步的。話雖如此,瀏覽器回應 DOM 更新的頁面重新渲染程序是異步的。這會給人一種異步 DOM 更新的錯覺。
有關 JavaScript事件回圈的更多資訊- https://developer.mozilla.org/en-US/docs/Web/JavaScript/EventLoop
轉載請註明出處,本文鏈接:https://www.uj5u.com/shujuku/375216.html
標籤:javascript dom 设置超时 事件循环
