我是擴展開發的絕對初學者,我試圖將我的頭腦圍繞在瀏覽器運行時,它由事件回圈 呼叫堆疊 Web API 組成。據我了解,如果您運行包含如下函式的腳本:
setTimeout(function msg() {
console.log("Hey guys.");
}, 4000);
呼叫setTimeout()將被推送到呼叫堆疊、執行并發送到 Web API,Web API 將啟動計時器四秒鐘,然后將console.log("Hey guys");呼叫推送到事件回圈佇列。只有在呼叫堆疊為空時,佇列上的這個呼叫才會被彈出,然后被推送到呼叫堆疊。這種回呼機制為 JavaScript 引擎提供了異步功能。
相同的程序是否適用于以下函式呼叫?
chrome.runtime.onInstalled.addListener(() => {
console.log("Hello");
})
這是我的困惑所在:
- 假設
addListener()被壓入呼叫堆疊,執行后會發生什么?瀏覽器現在是否“存盤”此偵聽器函式以便它知道要注意onInstalled事件?一旦檢測到事件,它會將回呼函式推送到事件回圈佇列嗎? - 為什么
addListener在事件物件上呼叫方法chrome.runtime.onInstalled而不是將其作為引數? chrome.runtime.onInstalled物件只是實際瀏覽器事件的表示,而不是事件本身嗎?(即 Chrome API 提供的物件)
uj5u.com熱心網友回復:
相同的程序是否適用于以下函式呼叫?
有點兒。
假設 addListener() 被推送到呼叫堆疊,它執行后會發生什么?
當腳本啟動時,addListener 將監聽器添加到內部事件注冊表而不呼叫它。注冊表以函式參考為鍵,因此每個事件只會注冊一次,即后續的 addListener 呼叫將被有效忽略。
然后腳本結束,所有的監聽器都注冊了。
然后,如果此腳本是非持久性后臺腳本(服務作業者或事件頁面),則喚醒后臺腳本的事件將用于在注冊表中查找其注冊的偵聽器并呼叫它們。這就是為什么檔案說 API 偵聽器必須在“頂級”中注冊的原因,盡管它過于簡單化了。從技術上講,監聽器必須在腳本結束之前注冊,即它可能發生在嵌套函式中,只要它同步運行,甚至在同步匯入的 ES 模塊中。
為什么在事件物件上呼叫addListener方法
這就是擴展 API 在內部實作的方式,沒有普遍的理由使用這種確切的形狀,這只是他們喜歡它的方式,而且它非常有意義,因為該物件包含各種有用的方法,如hasListener,removeListener和其他一些方法。
chrome.runtime.onInstalled 物件是否只是實際瀏覽器事件的表示,而不是事件本身?
這里的“事件”一詞并不是Event指派發給 JS 代碼的類似于 DOM 物件的事件實體。擴展 API 中沒有這樣的東西。它只是 API 的一個靜態部分,被嵌套以表示其結構:chrome是公共命名空間,runtime是特定 API,onInstalled是事件名稱。該物件在腳本啟動時由擴展平臺的內部 JS 層構建。
轉載請註明出處,本文鏈接:https://www.uj5u.com/ruanti/498331.html
標籤:javascript 谷歌浏览器 异步 谷歌浏览器扩展 运行
上一篇:Rust:異步不并發
