摘要:而函數(shù)調(diào)用結(jié)束返回時,運行時會將棧頂?shù)恼{(diào)用結(jié)構(gòu)彈出。并發(fā)模型與引擎是單線程的,它的并發(fā)模型基于事件循環(huán)當(dāng)線程中的同步任務(wù)執(zhí)行完,執(zhí)行棧為空時,則從任務(wù)隊列中取出異步任務(wù)進(jìn)行處理。在當(dāng)前的微任務(wù)沒有執(zhí)行完成時,是不會執(zhí)行下一個宏任務(wù)的。
堆/棧/隊列
在javascript中,存在調(diào)用棧 (call stack)和內(nèi)存堆(memory heap) ,程序中函數(shù)依次進(jìn)入棧中等待執(zhí)行,若執(zhí)行時遇到異步方法,該異步方法會被添加到用于回調(diào)的任務(wù)隊列(task queue)中,【即JavaScript執(zhí)行引擎的單線程擁有一個調(diào)用棧、內(nèi)存堆和一個任務(wù)隊列】
調(diào)用棧 (call stack):CallStack是用來處理函數(shù)調(diào)用與返回的。特點是先進(jìn)后出,每次調(diào)用一個函數(shù),Javascript運行時會生成一個新的調(diào)用結(jié)構(gòu)壓入CallStack。而函數(shù)調(diào)用結(jié)束返回時,JavaScript運行時會將棧頂?shù)恼{(diào)用結(jié)構(gòu)彈出。由于棧的LIFO特性,每次彈出的必然是最新調(diào)用的那個函數(shù)的結(jié)構(gòu)。函數(shù)調(diào)用會形成了一個堆棧幀,存放基本數(shù)據(jù)類型的變量并發(fā)模型 與 EventLoop內(nèi)存堆(memory head):引用數(shù)據(jù)類型被存放在堆中,在我們進(jìn)行淺復(fù)制時,我們改變的只是引用數(shù)據(jù)類型在棧內(nèi)存中的引用地址,實際上它在堆內(nèi)存中的引用地址仍然沒有發(fā)生變化
任務(wù)隊列(task queue):javaScript 運行時包含了一個待處理的任務(wù)隊列。
javascript引擎是單線程的,它的并發(fā)模型基于Event Loop(事件循環(huán))
當(dāng)線程中的同步任務(wù)執(zhí)行完,執(zhí)行棧為空時,則從任務(wù)隊列(task queue)中取出異步任務(wù)進(jìn)行處理。這個處理過程包含了調(diào)用與這個任務(wù)相關(guān)聯(lián)的函數(shù)(以及因而創(chuàng)建了一個初始堆棧幀)。當(dāng)執(zhí)行棧再次為空的時候,也就意味著該任務(wù)處理結(jié)束,從任務(wù)隊列中取出下一個異步任務(wù)進(jìn)行處理,不斷重復(fù),這個過程是循環(huán)不斷的, 所以整個的這種運行機(jī)制又稱為Event Loop(事件循環(huán)).Task Queue 任務(wù)隊列
任務(wù)隊列有宏任務(wù)隊列與微任務(wù)隊列,每次事件循環(huán)的時候,會先執(zhí)行宏任務(wù)隊列中的任務(wù),然后再執(zhí)行微任務(wù)隊列中的任務(wù)。 在當(dāng)前的微任務(wù)沒有執(zhí)行完成時,是不會執(zhí)行下一個宏任務(wù)的。
宏任務(wù):script(全局任務(wù)), setTimeout, setInterval, setImmediate, I/O, UI rendering.
微任務(wù):process.nextTick, Promise, Object.observer, MutationObserver.
文章版權(quán)歸作者所有,未經(jīng)允許請勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。
轉(zhuǎn)載請注明本文地址:http://specialneedsforspecialkids.com/yun/109524.html
摘要:需要注意的是,定時器只是將事件插入了任務(wù)隊列,必須等到當(dāng)前代碼執(zhí)行棧執(zhí)行完,主線程才會去執(zhí)行它指定的回調(diào)函數(shù)。如果當(dāng)前代碼耗時很長,有可能要等很久,所以并沒有辦法保證,回調(diào)函數(shù)一定會在指定的時間執(zhí)行。這也引申出的并發(fā)模型。 一、JavaScript的單線程 眾所周知,JavaScript的一大特點就是單線程,但是我們有沒有思考過它為什么不能是多線程的? 我們假定JavaScript有兩...
摘要:規(guī)范中定義了瀏覽器何時進(jìn)行渲染更新,了解它有助于性能優(yōu)化。結(jié)合一些資料,對上邊規(guī)范給出一些理解有誤請指正每個線程都有自己的。列為,列為,列為。我們都知道是單線程,渲染計算和腳本運行共用同一線程網(wǎng)絡(luò)請求會有其他線程,導(dǎo)致腳本運行會阻塞渲染。 本文轉(zhuǎn)自blog 轉(zhuǎn)載請注明出處 異步的思考 event loops隱藏得比較深,很多人對它很陌生。但提起異步,相信每個人都知道。異步背后的靠山就是...
摘要:回調(diào)函數(shù)任務(wù)完成的時候,需要執(zhí)行哪段代碼來處理呢當(dāng)然是回調(diào)函數(shù)了。事件處理器和回調(diào)函數(shù)類似。但是特定的事件處理器在瀏覽器進(jìn)入異步事件驅(qū)動階段時就會針對特定的事件注冊。當(dāng)事件對象返回到執(zhí)行線程時,事件處理器也會同時進(jìn)入執(zhí)行棧中執(zhí)行。 Event Loop(事件輪詢)機(jī)制是一個經(jīng)常把人搞暈的東東。我不敢說我完全明白,只是在此談?wù)勎业臏\見。 事件的處理 瀏覽器是一個事件驅(qū)動(event-dr...
摘要:由于是單線程的,這些方法就會按順序被排列在一個單獨的地方,這個地方就是所謂執(zhí)行棧。事件隊列每次僅執(zhí)行一個任務(wù),在該任務(wù)執(zhí)行完畢之后,再執(zhí)行下一個任務(wù)。 Event Loop 是 JavaScript 異步編程的核心思想,也是前端進(jìn)階必須跨越的一關(guān)。同時,它又是面試的必考點,特別是在 Promise 出現(xiàn)之后,各種各樣的面試題層出不窮,花樣百出。這篇文章從現(xiàn)實生活中的例子入手,讓你徹底理解 E...
閱讀 2623·2023-04-26 00:07
閱讀 2432·2021-11-15 11:37
閱讀 639·2021-10-19 11:44
閱讀 2164·2021-09-22 15:56
閱讀 1717·2021-09-10 10:50
閱讀 1497·2021-08-18 10:21
閱讀 2565·2019-08-30 15:53
閱讀 1630·2019-08-30 11:11