日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 前端技术 > javascript >内容正文

javascript

为什么JS是单线程?JS中的Event Loop(事件循环)?JS如何实现异步?setimeout?

發布時間:2025/7/14 javascript 24 豆豆
生活随笔 收集整理的這篇文章主要介紹了 为什么JS是单线程?JS中的Event Loop(事件循环)?JS如何实现异步?setimeout? 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

?

https://segmentfault.com/a/1190000012806637

https://www.jianshu.com/p/93d756db8c81

首先,請牢記2點:

(1) JS是單線程語言

(2) JS的Event Loop是JS的執行機制。

?Event Loop (事件循環):

? ? 只要主線程空了,就去讀取“任務隊列”,從任務隊列中讀取事件,這個過程是循環不斷的,所以整個的這個運行機制叫? Event Loop。

? ? ?主線程運行的時候,產生堆(head)和棧(stack),棧中的代碼(同步任務)調用各種外部API,它們在“任務隊列”(異步任務)中加入各種事件(click, load, done 等), 只要棧中的代碼(同步任務)執行完畢,主線程就會去讀取“任務隊列”(異步任務),依次去執行那些事件所對應的回調函數。

除了廣義的同步任務和異步任務,我們對任務更準確的劃分方式是:

Macrotask? (宏任務):

包括整體代碼script

etImmediate:把回調函數放在事件隊列的尾部

setTimeout:定時器

setInterval:定時器

Microtask?微任務):

process.nextTick:把回調函數放在當前執行棧的底部

Promise:

按照這種分類方式:JS的執行機制是:

  • 執行一個宏任務,過程中如果遇到微任務,就將其放到微任務的【事件隊列】里
  • 當前宏任務執行完成后,會查看微任務的【事件隊列】,并將里面全部的微任務依次執行完

重復以上2步驟,就是更為準確的JS執行機制了。

?

Node.js的Event Loop:?

Node.js的Event Loop

1. V8引擎解析JavaScript腳本。

2. 解析后的代碼,調用Node API。

3. libuv庫負責Node API的執行。它將不同的任務分配給不同的線程,形成一個Event Loop(事件循環),以異步的方式將任務的執行結果返回給V8引擎。

4. V8引擎再將結果返回給用戶。

靈魂三問 : JS為什么是單線程的? 為什么需要異步? JS單線程又是如何實現異步的呢?

(1)JS為什么是單線程的?

JavaScript的主要用途主要是用戶互動,和操作DOM。如果JavaScript同時有兩個線程,一個線程在某個DOM節點上添加內容,另一個線程刪除了這個節點,這時這兩個節點會有很大沖突,為了避免這個沖突,所以決定了它只能是單線程。

(2)為什么需要異步?

如果JS中不存在異步,只能自上而下執行,如果上一行解析時間很長,那么下面的代碼就會被阻塞。 對于用戶而言,阻塞就意味著"卡死",這樣就導致了很差的用戶體驗。所以,JS中存在異步執行。

(3)單線程又是如何實現異步的呢?

?JS是通過的事件循環(event loop),理解了event loop機制,就理解了JS的執行機制

?

談談setTimeout

這段setTimeout代碼什么意思? 我們一般說: 3秒后,會執行setTimeout里的那個函數

setTimeout(function(){console.log('執行了') },3000)

但是這種說并不嚴謹,準確的解釋是: 3秒后,setTimeout里的函數被會推入event queue,而event queue(事件隊列)里的任務,只有在主線程空閑時才會執行。

所以只有滿足 (1)3秒后 (2)主線程空閑,同時滿足時,才會3秒后執行該函數

如果主線程執行內容很多,執行時間超過3秒,比如執行了10秒,那么這個函數只能10秒后執行了

?

計時器

function?count( )
{ x?=?x?+?1
  document.display.box.value=?x
 ?timeoutID=setTimeout("count()",?1000)
}

?

解決setInterval計時器不準的問題

https://www.cnblogs.com/flash3d/archive/2014/05/08/3715600.html

?

轉載于:https://www.cnblogs.com/leftJS/p/10959665.html

《新程序員》:云原生和全面數字化實踐50位技術專家共同創作,文字、視頻、音頻交互閱讀

總結

以上是生活随笔為你收集整理的为什么JS是单线程?JS中的Event Loop(事件循环)?JS如何实现异步?setimeout?的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。