摘要:基本知識(shí)棧先進(jìn)后出函數(shù)調(diào)用函數(shù)調(diào)用函數(shù)。而真正的值依然存在中,然后由垃圾回收器自動(dòng)的清理回收。異步任務(wù)是由瀏覽器執(zhí)行的。當(dāng)任務(wù)執(zhí)行完之后,瀏覽器會(huì)將任務(wù)執(zhí)行的結(jié)果和實(shí)現(xiàn)定義的回調(diào)函數(shù)放入主線程中。
基本知識(shí)
棧:先進(jìn)后出
函數(shù)a調(diào)用函數(shù)b,b調(diào)用函數(shù)c。執(zhí)行函數(shù)a,a入棧,a調(diào)用b, b入棧, b調(diào)用c,c入棧,c執(zhí)行,返回結(jié)果,彈出棧,依次類推,最后a出棧 === 》先進(jìn)后出
指針:當(dāng)函數(shù)執(zhí)行完畢后
基本數(shù)據(jù)類型會(huì)從 stack 中彈出
對(duì)象、數(shù)組的值是存在于 heap(堆) 中的,stack 只彈出指針了他們對(duì)應(yīng)的指針。而真正的值依然存在 heap 中,然后由垃圾回收器自動(dòng)的清理回收。
異步任務(wù)是由瀏覽器執(zhí)行的。當(dāng)任務(wù)執(zhí)行完之后,瀏覽器會(huì)將任務(wù)執(zhí)行的結(jié)果和實(shí)現(xiàn)定義的回調(diào)函數(shù)放入主線程中。所以當(dāng)主線程任務(wù)阻塞的時(shí)候,任務(wù)隊(duì)列還是可以正常進(jìn)行的。
macro tasks 和 micro tasks 分類沒(méi)有找到很官方的定義,這個(gè)與瀏覽器引擎相關(guān),看瀏覽器引擎怎么定義任務(wù)的分類,以下是比較普遍的分類
macro tasks: 定時(shí)器、http、IO操作(setTimeout, setInterval, setImmediate, I/O, UI rendering)
micro tasks: process.nextTick, Promises, Object.observe(廢棄), MutationObserver
執(zhí)行順序在同一輪執(zhí)行中,micro tasks優(yōu)先級(jí)比macro tasks高
在執(zhí)行同步任務(wù)過(guò)程中,碰到了macro tasks或者micro tasks,將其放入相對(duì)應(yīng)的棧中。
先將所有的同步任務(wù)執(zhí)行完
查看micro tasks,里面是否有任務(wù),有的話,執(zhí)行完所有的任務(wù)。
micro tasks執(zhí)行過(guò)后,查看macro tasks,查看里面是否有任務(wù),如果有,執(zhí)行第一個(gè)放入的任務(wù)。
micro tasks執(zhí)行完一個(gè)后,重復(fù)步驟1,2,3,4。
文章版權(quán)歸作者所有,未經(jīng)允許請(qǐng)勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。
轉(zhuǎn)載請(qǐng)注明本文地址:http://www.ezyhdfw.cn/yun/98077.html
摘要:的回調(diào)函數(shù)正是處于隊(duì)列之中。將看做會(huì)導(dǎo)致性能問(wèn)題,回調(diào)函數(shù)可能會(huì)因?yàn)殇秩镜认嚓P(guān)產(chǎn)生不必要的延后。瀏覽器是怎么出錯(cuò)的和在兩次點(diǎn)擊操作之間運(yùn)行完成了所有的,就比如的回調(diào)函數(shù)所展示的,但是似乎有不同的排序算法。 帶有可視代碼執(zhí)行順序的原文鏈接https://jakearchibald.com/201...,此篇文字并非其完整翻譯,加入了一部分自己的理解,比如將其中的task替換為macrot...
摘要:的回調(diào)函數(shù)正是處于隊(duì)列之中。將看做會(huì)導(dǎo)致性能問(wèn)題,回調(diào)函數(shù)可能會(huì)因?yàn)殇秩镜认嚓P(guān)產(chǎn)生不必要的延后。瀏覽器是怎么出錯(cuò)的和在兩次點(diǎn)擊操作之間運(yùn)行完成了所有的,就比如的回調(diào)函數(shù)所展示的,但是似乎有不同的排序算法。 帶有可視代碼執(zhí)行順序的原文鏈接https://jakearchibald.com/201...,此篇文字并非其完整翻譯,加入了一部分自己的理解,比如將其中的task替換為macrot...
摘要:但是事件循環(huán)一般會(huì)在主線程中任務(wù)執(zhí)行完成之后執(zhí)行。所以,上面函數(shù)的調(diào)用棧過(guò)程如下總結(jié)的事件循環(huán)部分,內(nèi)容應(yīng)該算是全部闡述完全了。 前言 還記得那些年面試官問(wèn)你的定時(shí)器的原理嗎?還有呢?Promise的原理呢?原理、原理、原理,問(wèn)的我們懷疑人生。 為了下次不再懵逼,今天,我們來(lái)了解一下Event Loop的概念。我們的初衷是真正的了解和掌握它,了解整體JavaScript的運(yùn)行機(jī)制。至少...
摘要:任務(wù)隊(duì)列是一個(gè)事件隊(duì)列,只要指定過(guò)回調(diào)函數(shù)的事件在事件發(fā)生時(shí)就會(huì)進(jìn)入任務(wù)隊(duì)列。回調(diào)函數(shù)會(huì)被主線程掛起來(lái)的代碼,異步任務(wù)必須指定回調(diào)函數(shù)。 1、靜態(tài)公有方法 (function(){ var privateVariable=10; function privateFunction(){ return false; } MyObject=fu...
閱讀 3318·2023-04-25 18:43
閱讀 989·2021-11-24 09:39
閱讀 1417·2021-10-14 09:43
閱讀 3967·2021-09-22 15:58
閱讀 2060·2019-08-29 17:18
閱讀 482·2019-08-29 14:14
閱讀 3139·2019-08-29 13:01
閱讀 1672·2019-08-29 12:33