在线观看不卡亚洲电影_亚洲妓女99综合网_91青青青亚洲娱乐在线观看_日韩无码高清综合久久

鍍金池/ 問(wèn)答/Java  HTML/ js的異步執(zhí)行的問(wèn)題。

js的異步執(zhí)行的問(wèn)題。

最近在js的基礎(chǔ)知識(shí),看到j(luò)s的事件循環(huán)機(jī)制,產(chǎn)生了幾點(diǎn)疑問(wèn),希望各位能人不吝賜教。
有這么一句話:(1)所有同步任務(wù)都在主線程上執(zhí)行,形成一個(gè)執(zhí)行棧(execution context stack)。
棧的特點(diǎn)是先進(jìn)后出,那么此時(shí)所有的同步任務(wù)的執(zhí)行順序不應(yīng)該是和我進(jìn)棧的順序相反嗎?還是說(shuō),每次只進(jìn)棧一個(gè)任務(wù)?
對(duì)于ajax這種異步來(lái)說(shuō),是不是主線程執(zhí)行了ajax發(fā)出了網(wǎng)絡(luò)請(qǐng)求,在等待網(wǎng)絡(luò)請(qǐng)求回復(fù)的時(shí)候,去執(zhí)行了其他任務(wù),等到主線程同步任務(wù)執(zhí)行結(jié)束了,才回去異步隊(duì)列里面找到ajax執(zhí)行他的回調(diào)函數(shù)?還是說(shuō),直接執(zhí)行后面的所有的同步操作后在開(kāi)始執(zhí)行ajax?

回答
編輯回答
汐顏
  1. execution context stack 應(yīng)該說(shuō)的是執(zhí)行上下文環(huán)境的一個(gè)棧吧(里面存儲(chǔ)的是函數(shù)可訪問(wèn)到的變量啊什么的),主線程上的函數(shù)是依次執(zhí)行的

  2. 對(duì)于異步你可以去看看Node的Event Loop應(yīng)該會(huì)得到答案

2017年3月6日 13:29
編輯回答
還吻

樓主你需要再深入了解一下event loop
有一個(gè)概念叫做任務(wù)隊(duì)列(task queue),任務(wù)隊(duì)列執(zhí)行的順序是先進(jìn)先出。
那個(gè)執(zhí)行棧,你就想一下你在寫(xiě)代碼時(shí)經(jīng)常遇到的嵌套函數(shù)(舉例子):

function a(){
    console.log('a')
}
function b(){
    a()
}
function c(){
    b()
}
c()

這個(gè)時(shí)候的進(jìn)棧順序就是c->b->a,但是執(zhí)行完的順序就是出棧順序a->b->c。這種情況才是題主說(shuō)到的執(zhí)行棧的情況。

對(duì)于ajax這種異步來(lái)說(shuō),當(dāng)主線程遇到一個(gè)ajax請(qǐng)求,會(huì)發(fā)送請(qǐng)求,將ajax交給瀏覽器的webapi去執(zhí)行,然后繼續(xù)執(zhí)行后面的代碼。
而當(dāng)瀏覽器接收到ajax返回?cái)?shù)據(jù)時(shí),會(huì)將回調(diào)函數(shù)放到任務(wù)隊(duì)列的末端,當(dāng)正在執(zhí)行的同步代碼全部執(zhí)行完后,才會(huì)去執(zhí)行該ajax回調(diào)。
任務(wù)隊(duì)列嚴(yán)格來(lái)說(shuō),也有兩個(gè)不同的來(lái)源,分別是microtask和macrotask,他們之間的執(zhí)行順序也有區(qū)別~
想看更具體的,厚臉皮安利一下自己的博文φ(>ω<*)
通過(guò)microtasks和macrotasks看JavaScript異步任務(wù)執(zhí)行順序

2018年5月23日 10:12