1 .js執(zhí)行代碼的時(shí)候會(huì)將不同的變量存于內(nèi)存中的不同位置。堆中存的是對(duì)象,棧中存放一些基礎(chǔ)類型變量以及對(duì)象的指針
2 .當(dāng)調(diào)用一個(gè)方法的時(shí)候,js會(huì)生成一個(gè)與這個(gè)方法對(duì)應(yīng)的執(zhí)行環(huán)境,又叫執(zhí)行上下文。這個(gè)執(zhí)行環(huán)境中存放著這個(gè)方法的私有作用域,上層作用域的指向,方法的參數(shù)。這個(gè)作用域中定義的變量以及這個(gè)作用域的this對(duì)象。
3 .當(dāng)這些方法被依次調(diào)用的時(shí)候,因?yàn)閖s是單線程的,同一個(gè)時(shí)間執(zhí)行執(zhí)行一個(gè)方法,于是這些方法被排隊(duì)在一個(gè)單獨(dú)的地方,這個(gè)地方就是執(zhí)行棧
4 .一個(gè)方法執(zhí)行會(huì)向執(zhí)行棧中加入這個(gè)方法的執(zhí)行環(huán)境。這個(gè)執(zhí)行環(huán)境中甚至還可以調(diào)用其它方法,甚至自己,其結(jié)果不過是在執(zhí)行棧中在添加一個(gè)執(zhí)行環(huán)境。這個(gè)環(huán)境是可以無限進(jìn)行下去的,除非發(fā)生了棧溢出,及超過了所能使用內(nèi)存的最大值
5 .js引擎遇到異步事件后并不會(huì)一直等待其返回結(jié)果,而是會(huì)將這個(gè)事件掛起,繼續(xù)執(zhí)行執(zhí)行棧中的其他任務(wù),當(dāng)一個(gè)異步事件返回結(jié)果后---》重點(diǎn)。js會(huì)將這個(gè)事件加入與當(dāng)前執(zhí)行棧不同的另一個(gè)隊(duì)列。就是事件隊(duì)列
6 .被放入事件隊(duì)列的事件不會(huì)立刻執(zhí)行回調(diào),而是等待當(dāng)前執(zhí)行棧中的所有任務(wù)都執(zhí)行完畢,主線程處于閑置狀態(tài)時(shí)。主線程會(huì)查找事件隊(duì)列中是否有任務(wù),如果有的話,會(huì)從中取出排在第一位的事件,并把這個(gè)事件對(duì)應(yīng)的回調(diào)放入執(zhí)行棧中,然后執(zhí)行其中的同步代碼。如此反復(fù),成為一個(gè)循環(huán)
微任務(wù)和宏任務(wù)
1 .異步任務(wù)之間分為兩類微任務(wù)和宏任務(wù)
2 .根據(jù)異步事件的類型,這個(gè)事件實(shí)際上會(huì)被對(duì)分到對(duì)應(yīng)的宏任務(wù)或者微任務(wù)隊(duì)列中去。當(dāng)前執(zhí)行棧為空的時(shí)候,會(huì)立刻先處理所有微任務(wù)隊(duì)列中的事件,把對(duì)應(yīng)的回調(diào)加入當(dāng)前執(zhí)行棧,如此反復(fù),進(jìn)入循環(huán)
3 .然后采取宏任務(wù)隊(duì)列中取出一個(gè)事件,同一次事件循環(huán)中,微任務(wù)永遠(yuǎn)在宏任務(wù)之前執(zhí)行