摘要:異步任務(wù)必須指定回調(diào)函數(shù),當(dāng)異步任務(wù)從任務(wù)隊(duì)列回到執(zhí)行棧,回調(diào)函數(shù)就會執(zhí)行。事件循環(huán)主線程從任務(wù)隊(duì)列中讀取事件,這個過程是循環(huán)不斷的,所以整個的這種運(yùn)行機(jī)制又稱為。事件循環(huán)事件循環(huán)是指主線程重復(fù)從消息隊(duì)列中取消息執(zhí)行的過程。
參考鏈接:
這一次,徹底弄懂 JavaScript 執(zhí)行機(jī)制
https://zhuanlan.zhihu.com/p/...
從瀏覽器多進(jìn)程到JS單線程,JS運(yùn)行機(jī)制最全面的一次梳理
JavaScript引擎是單線程運(yùn)行的,瀏覽器無論在什么時候都只且只有一個線程在運(yùn)行JavaScript程序.瀏覽器的內(nèi)核是多線程的,它們在內(nèi)核制控下相互配合以保持同步,一個瀏覽器至少實(shí)現(xiàn)三個常駐線程:javascript引擎線程,GUI渲染線程,瀏覽器事件觸發(fā)線程。這些異步線程都會產(chǎn)生不同的異步的事件.
javascript引擎是基于事件驅(qū)動單線程執(zhí)行的,JS引擎一直等待著任務(wù)隊(duì)列中任務(wù)的到來,然后加以處理,瀏覽器無論什么時候都只有一個JS線程在運(yùn)行JS程序。
GUI渲染線程負(fù)責(zé)渲染瀏覽器界面,當(dāng)界面需要重繪(Repaint)或由于某種操作引發(fā)回流(reflow)時,該線程就會執(zhí)行。但需要注意 GUI渲染線程與JS引擎是互斥的,當(dāng)JS引擎執(zhí)行時GUI線程會被掛起,GUI更新會被保存在一個隊(duì)列中等到JS引擎空閑時立即被執(zhí)行。
事件觸發(fā)線程,當(dāng)一個事件被觸發(fā)時該線程會把事件添加到待處理隊(duì)列的隊(duì)尾,等待JS引擎的處理。這些事件可來自JavaScript引擎當(dāng)前執(zhí)行的代碼塊如setTimeOut、也可來自瀏覽器內(nèi)核的其他線程如鼠標(biāo)點(diǎn)擊、AJAX異步請求等,但由于JS的單線程關(guān)系所有這些事件都得排隊(duì)等待JS引擎處理。(當(dāng)線程中沒有執(zhí)行任何同步代碼的前提下才會執(zhí)行異步代碼)
JavaScript運(yùn)行機(jī)制程序中跑兩個線程,一個負(fù)責(zé)程序本身的運(yùn)行,作為主線程; 另一個負(fù)責(zé)主線程與其他線程的的通信,被稱為“Event Loop 線程" 。每當(dāng)遇到異步任務(wù),交給 EventLoop 線程,然后自己往后運(yùn)行,等到主線程運(yùn)行完后,再去 EventLoop 線程拿結(jié)果。
1)所有任務(wù)都在主線程上執(zhí)行,形成一個執(zhí)行棧(execution context stack)。
2)主線程之外,還存在一個"任務(wù)隊(duì)列"(task queue)。系統(tǒng)把異步任務(wù)放到"任務(wù)隊(duì)列"之中,然后繼續(xù)執(zhí)行后續(xù)的任務(wù)。
3)一旦"執(zhí)行棧"中的所有任務(wù)執(zhí)行完畢,系統(tǒng)就會讀取"任務(wù)隊(duì)列"。如果這個時候,異步任務(wù)已經(jīng)結(jié)束了等待狀態(tài),就會從"任務(wù)隊(duì)列"進(jìn)入執(zhí)行棧,恢復(fù)執(zhí)行。
4)主線程不斷重復(fù)上面的第三步。
"回調(diào)函數(shù)"(callback),就是那些會被主線程掛起來的代碼。異步任務(wù)必須指定回調(diào)函數(shù),當(dāng)異步任務(wù)從"任務(wù)隊(duì)列"回到執(zhí)行棧,回調(diào)函數(shù)就會執(zhí)行。"任務(wù)隊(duì)列"是一個先進(jìn)先出的數(shù)據(jù)結(jié)構(gòu),排在前面的事件,優(yōu)先返回主線程。主線程的讀取過程基本上是自動的,只要執(zhí)行棧一清空,"任務(wù)隊(duì)列"上第一位的事件就自動返回主線程。
Event Loop(事件循環(huán))主線程從"任務(wù)隊(duì)列"中讀取事件,這個過程是循環(huán)不斷的,所以整個的這種運(yùn)行機(jī)制又稱為Event Loop。
Event Loop 是一個很重要的概念,指的是計(jì)算機(jī)系統(tǒng)的一種運(yùn)行機(jī)制。JavaScript語言就采用這種機(jī)制,來解決單線程運(yùn)行帶來的一些問題。
javascript是單線程的,這個線程中擁有唯一的一個事件循環(huán)。異步setTimeout & setInterval 概念
JavaScript代碼的執(zhí)行過程中,除了依靠函數(shù)調(diào)用棧來搞定函數(shù)的執(zhí)行順序外,還依靠任務(wù)隊(duì)列(task queue)來搞定另外一些代碼的執(zhí)行。
一個線程中,事件循環(huán)是唯一的,但是任務(wù)隊(duì)列可以擁有多個。
setTimeout:在指定的毫秒數(shù)后,將定時任務(wù)處理的函數(shù)添加到執(zhí)行隊(duì)列的隊(duì)尾。
setInterval:按照指定的周期(以毫秒數(shù)計(jì)時),將定時任務(wù)處理函數(shù)添加到執(zhí)行隊(duì)列的隊(duì)尾。
從主線程的角度看,一個異步過程包括下面兩個要素:
發(fā)起函數(shù)(或叫注冊函數(shù))A
回調(diào)函數(shù)callbackFn
它們都是在主線程上調(diào)用的,其中注冊函數(shù)用來發(fā)起異步過程,回調(diào)函數(shù)用來處理結(jié)果。
例如setTimeout(fn, 1000),其中的setTimeout就是異步過程的發(fā)起函數(shù),fn是回調(diào)函數(shù)。用一句話概括:工作線程將消息放到消息隊(duì)列,主線程通過事件循環(huán)過程去取消息。
消息隊(duì)列:消息隊(duì)列是一個先進(jìn)先出的隊(duì)列,它里面存放著各種消息。
事件循環(huán):事件循環(huán)是指主線程重復(fù)從消息隊(duì)列中取消息、執(zhí)行的過程。
文章版權(quán)歸作者所有,未經(jīng)允許請勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。
轉(zhuǎn)載請注明本文地址:http://m.hztianpu.com/yun/93792.html
摘要:從最開始的到封裝后的都在試圖解決異步編程過程中的問題。為了讓編程更美好,我們就需要引入來降低異步編程的復(fù)雜性。異步編程入門的全稱是前端經(jīng)典面試題從輸入到頁面加載發(fā)生了什么這是一篇開發(fā)的科普類文章,涉及到優(yōu)化等多個方面。 TypeScript 入門教程 從 JavaScript 程序員的角度總結(jié)思考,循序漸進(jìn)的理解 TypeScript。 網(wǎng)絡(luò)基礎(chǔ)知識之 HTTP 協(xié)議 詳細(xì)介紹 HTT...
摘要:設(shè)計(jì)模式資源整理操作符小知識點(diǎn)實(shí)現(xiàn)發(fā)郵件功能數(shù)據(jù)結(jié)構(gòu)與算法資源整理跨域函數(shù)的合成與柯里化系列之防抖節(jié)流系列之正則系列之系列之系列之編碼系列之系列之操作符對象中的坐標(biāo)檢測對象或數(shù)組系列之機(jī)制系列之構(gòu)造對象系列之總結(jié)系列之淺復(fù)制與深復(fù)制系列之對 Javascript設(shè)計(jì)模式資源整理JS操作符JS小知識點(diǎn)JS實(shí)現(xiàn)發(fā)郵件功能數(shù)據(jù)結(jié)構(gòu)與算法資源整理跨域函數(shù)的合成與柯里化JS系列之防抖節(jié)流JS系列...
摘要:是現(xiàn)在廣泛流行的代從開始學(xué)習(xí)系列之向提交代碼掘金讀完本文大概需要分鐘。為了進(jìn)行高效的垃圾回收,虛擬機(jī)把堆內(nèi)存劃分成新生代老年代和永久代中無永久代,使用實(shí)現(xiàn)三塊區(qū)域。 React Native 開源項(xiàng)目 - 仿美團(tuán)客戶端 (Android、iOS 雙適配) - Android - 掘金推薦 React Native 學(xué)習(xí)好項(xiàng)目,仿照美團(tuán)客戶端... 極簡 GitHub 上手教程 - 工具...
摘要:模塊化是隨著前端技術(shù)的發(fā)展,前端代碼爆炸式增長后,工程化所采取的必然措施。目前模塊化的思想分為和。特別指出,事件不等同于異步,回調(diào)也不等同于異步。將會討論安全的類型檢測惰性載入函數(shù)凍結(jié)對象定時器等話題。 Vue.js 前后端同構(gòu)方案之準(zhǔn)備篇——代碼優(yōu)化 目前 Vue.js 的火爆不亞于當(dāng)初的 React,本人對寫代碼有潔癖,代碼也是藝術(shù)。此篇是準(zhǔn)備篇,工欲善其事,必先利其器。我們先在代...
閱讀 3489·2022-01-04 14:20
閱讀 3177·2021-09-22 15:08
閱讀 2273·2021-09-03 10:44
閱讀 2365·2019-08-30 15:44
閱讀 1559·2019-08-29 18:40
閱讀 2727·2019-08-29 17:09
閱讀 3057·2019-08-26 13:53
閱讀 3275·2019-08-26 13:37