javascript
为什么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 Loop1. 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?的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: Dinic最大流 || Luogu P
- 下一篇: 第 2 章