中文字幕av专区_日韩电影在线播放_精品国产精品久久一区免费式_av在线免费观看网站

溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務條款》

什么是?事件循環event loop

發布時間:2021-09-17 13:45:08 來源:億速云 閱讀:123 作者:柒染 欄目:web開發

這篇文章給大家介紹什么是事件循環event loop,內容非常詳細,感興趣的小伙伴們可以參考借鑒,希望對大家能有所幫助。

什么是?事件循環event loop

事件循環event loop。

一個老生常談的問題,之所以拿出來說,推薦的原因在于:

通過幾張動圖的形式,就把這個過程描述清楚了,太有趣了。

為什么需要它

JavaScript是單線程的:一次只能運行一個任務。通常,這沒什么大不了的,但是現在想象一下您正在運行一個耗時30秒的任務。在此任務中,我們等待30秒才能進行其他任何操作(默認情況下,JavaScript在瀏覽器的主線程上運行,因此整個用戶界面都被卡住了)。

這樣子的體驗是不能接受的,你不能把時間花在這么一個遲鈍的網站。

幸運的是,瀏覽器為我們提供了JavaScript引擎本身不提供的一些功能:Web API。這包括DOM  API,setTimeout,HTTP請求等。這可以幫助我們創建一些異步的,非阻塞的行為。

初次見面

當我們調用一個函數時,它會被添加到一個叫做調用棧的東西中。調用堆棧是JS引擎的一部分,這與瀏覽器無關。它是一個堆棧,意味著它是先入后出的(想想一堆薄餅)。當一個函數返回一個值時,它被從堆棧中彈出。

什么是?事件循環event loop

流程圖1

響應函數返回一個setTimeout函數。setTimeout是由Web  API提供給我們的:它讓我們在不阻塞主線程的情況下延遲任務。我們傳遞給setTimeout函數的回調函數,箭頭函數()=> { return 'Hey'  }被添加到Web API中。同時,setTimeout函數和response函數被從堆棧中彈出,它們都返回了它們的值!

什么是?事件循環event loop

流程圖2

在Web  API中,定時器的運行時間與我們傳遞給它的第二個參數一樣長,即1000ms。回調并不立即被添加到調用棧中,而是被傳遞到一個叫做隊列的東西中。

什么是?事件循環event loop

流程圖3

這可能是一個令人困惑的部分:這并不意味著回調函數在1000ms后被添加到callstack(從而返回一個值)!它只是在1000ms后被添加到隊列中。但這是一個隊列,該函數必須等待輪到它!

揭開面紗

現在是我們一直在等待的部分,是時候讓事件循環完成它唯一的任務了:將隊列和調用棧連接起來。如果調用棧是空的,那么如果所有先前調用的函數都已經返回了它們的值,并且已經從棧中彈出,那么隊列中的第一個項目就會被添加到調用棧中。在這種情況下,沒有其他函數被調用,也就是說,當回調函數成為隊列中的第一項時,調用棧是空的。

什么是?事件循環event loop

流程圖4

回調被添加到調用堆棧,被調用,并返回一個值,然后被從堆棧中彈出,如圖:

什么是?事件循環event loop

流程圖5

跑個demo

其實我看完這些動圖后,是很能理解作者思路滴,不過,我還是建議初學者,可以跑個例子看看,下面是一個不錯的例子:

const foo = () => console.log("First"); const bar = () => setTimeout(() => console.log("Second"), 500); const baz = () => console.log("Third");  bar(); foo(); baz();

雖然看起來很簡單,嗯,可以嘗試搞一下:

打開我們的瀏覽器,跑一下上面的代碼,讓我們快速看一下在瀏覽器中運行此代碼時發生的情況:

什么是?事件循環event loop

關于什么是事件循環event loop就分享到這里了,希望以上內容可以對大家有一定的幫助,可以學到更多知識。如果覺得文章不錯,可以把它分享出去讓更多的人看到。

向AI問一下細節

免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。

AI

长葛市| 那曲县| 都兰县| 绥江县| 四平市| 河西区| 武乡县| 余江县| 东阳市| 台东县| 平江县| 华蓥市| 余姚市| 天祝| 育儿| 洪湖市| 宜兰市| 庐江县| 陕西省| 永定县| 永福县| 临漳县| 南昌市| 新化县| 德昌县| 定边县| 额济纳旗| 浏阳市| 沁阳市| 宜州市| 安仁县| 雷山县| 驻马店市| 布拖县| 临朐县| 姚安县| 桂平市| 宁海县| 邮箱| 峡江县| 博客|