国产xxxx99真实实拍_久久不雅视频_高清韩国a级特黄毛片_嗯老师别我我受不了了小说

資訊專欄INFORMATION COLUMN

【Javascript】探究javascript中的堆/棧/任務(wù)隊列與并發(fā)模型 event loop

desdik / 2518人閱讀

摘要:而函數(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ù)類型的變量

內(nèi)存堆(memory head):引用數(shù)據(jù)類型被存放在堆中,在我們進(jìn)行淺復(fù)制時,我們改變的只是引用數(shù)據(jù)類型在棧內(nèi)存中的引用地址,實際上它在堆內(nèi)存中的引用地址仍然沒有發(fā)生變化

任務(wù)隊列(task queue):javaScript 運行時包含了一個待處理的任務(wù)隊列。

并發(fā)模型 與 EventLoop

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.

如果我的文章對你有幫助,歡迎關(guān)注我的博客,JS/Python/算法系列,碼不停題!!!

文章版權(quán)歸作者所有,未經(jīng)允許請勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。

轉(zhuǎn)載請注明本文地址:http://specialneedsforspecialkids.com/yun/109524.html

相關(guān)文章

  • JavaScript并發(fā)模型Event Loop

    摘要:需要注意的是,定時器只是將事件插入了任務(wù)隊列,必須等到當(dāng)前代碼執(zhí)行棧執(zhí)行完,主線程才會去執(zhí)行它指定的回調(diào)函數(shù)。如果當(dāng)前代碼耗時很長,有可能要等很久,所以并沒有辦法保證,回調(diào)函數(shù)一定會在指定的時間執(zhí)行。這也引申出的并發(fā)模型。 一、JavaScript的單線程 眾所周知,JavaScript的一大特點就是單線程,但是我們有沒有思考過它為什么不能是多線程的? 我們假定JavaScript有兩...

    DevWiki 評論0 收藏0
  • event loop規(guī)范探究javaScript異步及瀏覽器更新渲染時機(jī)

    摘要:規(guī)范中定義了瀏覽器何時進(jìn)行渲染更新,了解它有助于性能優(yōu)化。結(jié)合一些資料,對上邊規(guī)范給出一些理解有誤請指正每個線程都有自己的。列為,列為,列為。我們都知道是單線程,渲染計算和腳本運行共用同一線程網(wǎng)絡(luò)請求會有其他線程,導(dǎo)致腳本運行會阻塞渲染。 本文轉(zhuǎn)自blog 轉(zhuǎn)載請注明出處 異步的思考 event loops隱藏得比較深,很多人對它很陌生。但提起異步,相信每個人都知道。異步背后的靠山就是...

    13651657101 評論0 收藏0
  • 理解Event-Loop

    摘要:回調(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...

    blair 評論0 收藏0
  • 最后一次搞懂 Event Loop

    摘要:由于是單線程的,這些方法就會按順序被排列在一個單獨的地方,這個地方就是所謂執(zhí)行棧。事件隊列每次僅執(zhí)行一個任務(wù),在該任務(wù)執(zhí)行完畢之后,再執(zhí)行下一個任務(wù)。 Event Loop 是 JavaScript 異步編程的核心思想,也是前端進(jìn)階必須跨越的一關(guān)。同時,它又是面試的必考點,特別是在 Promise 出現(xiàn)之后,各種各樣的面試題層出不窮,花樣百出。這篇文章從現(xiàn)實生活中的例子入手,讓你徹底理解 E...

    gself 評論0 收藏0

發(fā)表評論

0條評論

最新活動
閱讀需要支付1元查看
<