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