javascript
JavaScript单线程
?
?? ?JavaScript的單線程源于其需要與用戶進行交互,通過響應(yīng)用戶的操作作出相應(yīng)的反應(yīng)。如果非單線程,那么當(dāng)用戶執(zhí)行兩個相互矛盾的操作時,都需要得到響應(yīng),那么究竟是哪一個先哪一個后呢?因此,為了避免這種矛盾,JavaScript總是單線程執(zhí)行。
??? JavaScript任務(wù)分為兩種:同步任務(wù)、異步任務(wù)。同步任務(wù)位于主線程上,形成一個執(zhí)行棧,后一個任務(wù)的執(zhí)行需要依賴于前一個任務(wù)的執(zhí)行結(jié)束;而以不變?nèi)蝿?wù)位于任務(wù)隊列中,暫時不進入主線程,其需要等待主線程上的任務(wù)執(zhí)行完,且自己需要的資源得到,再利用回調(diào)函數(shù)執(zhí)行該任務(wù)。即主線程上的任務(wù)執(zhí)行結(jié)束之后才會調(diào)用任務(wù)隊列中的任務(wù)。其中定時器(setTimeout()和setInterval())也放置在任務(wù)隊列中,指定相應(yīng)的回調(diào)函數(shù)在多少時間之后執(zhí)行。
eg.
setTimeout(function(){console.log(1);}, 0); console.log(2);先執(zhí)行主線程上的任務(wù),即console.log(2);其執(zhí)行完畢才會執(zhí)行任務(wù)隊列中的任務(wù),即第一句的定時器函數(shù)。因此會輸出2,1。
ps:當(dāng)定時器指定的時間到了之后,若前面任務(wù)還沒有執(zhí)行完,則繼續(xù)執(zhí)行前面的任務(wù),等待任務(wù)執(zhí)行完畢之后立即調(diào)用定時器函數(shù)。若前面任務(wù)已經(jīng)執(zhí)行完畢,但定時器的時間還沒到,則等待時間到了再執(zhí)行定時器函數(shù),這個空閑時間段可以先去執(zhí)行別的任務(wù)。
?
?
學(xué)習(xí)&感謝:
http://www.ruanyifeng.com/blog/2014/10/event-loop.html
<<JavaScript高級程序設(shè)計>>
?
轉(zhuǎn)載于:https://www.cnblogs.com/haimengqingyuan/p/7216448.html
總結(jié)
以上是生活随笔為你收集整理的JavaScript单线程的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: nodejs 全局变量和全局对象
- 下一篇: C#流对象使用完后不立即释放的问题