JS 堆棧內(nèi)存的一點(diǎn)理解

在 JS 中,內(nèi)存分兩種:堆內(nèi)存和棧內(nèi)存。簡(jiǎn)單理解,棧內(nèi)存就是給代碼的執(zhí)行提供一個(gè)環(huán)境,也叫上下文,它的大小是固定的(存在棧內(nèi)存溢出的情況);而堆內(nèi)存是用來(lái)存儲(chǔ)引用類型值的,比如對(duì)象、數(shù)組等,它的大小不固定。

內(nèi)存生命周期

  • 分配:在變量剛被定義時(shí)就被分配了內(nèi)存
  • 使用:在使用變量時(shí)其實(shí)是對(duì)其內(nèi)存進(jìn)行讀取、寫(xiě)入
  • 回收:內(nèi)存不是無(wú)限使用的,JS 有垃圾回收機(jī)制

堆內(nèi)存的訪問(wèn)

let b = [1, 2, 3, 4];
let c = b;
c.pop();
console.log(b);//[1, 2, 3]

第一行代碼在內(nèi)存中聲明了一個(gè)變量 b ,它的值是一個(gè)數(shù)組的引用,這個(gè)數(shù)組的值存儲(chǔ)在堆內(nèi)存中,在訪問(wèn)這個(gè)數(shù)組的時(shí)候不是通過(guò)值直接訪問(wèn)的而是通過(guò)訪問(wèn)它在內(nèi)存中的地址(堆內(nèi)存中的每個(gè)變量對(duì)象都有一個(gè)16進(jìn)制地址)。所以變量 b 中存儲(chǔ)的就是該數(shù)組在堆內(nèi)存中的地址,變量 c 獲得了地址后對(duì)其進(jìn)行操作,其結(jié)果是改變了堆內(nèi)存中那個(gè)數(shù)組對(duì)象的值,而變量 b 和變量 c 的值未變——堆內(nèi)存中的地址。
一個(gè)容易錯(cuò)的問(wèn)題

let a = {};
let b = [1, 2, 3, 4];
let c = b;
c = a;
console.log(b);// [1, 2, 3, 4]
console.log(c);// {}

b 和 c 同時(shí)獲得了數(shù)組對(duì)象的引用后,將 a 的值賦值給 c,這時(shí)候就比較容易想錯(cuò):變量 a 會(huì)不會(huì)將數(shù)組對(duì)象在內(nèi)存中覆蓋?答案是不會(huì)。因?yàn)橘x值操作永遠(yuǎn)是操作基本類型值,而不直接操作引用類型,即“賦”的是16進(jìn)制地址。

單線程

為什么 JavaScript 是單線程的呢?想象一下,如果它是多線程的,兩個(gè)線程同時(shí)操作同一個(gè) DOM ,必然會(huì)造成混亂,所以 JavaScript 必然是單線程的。它的異步和多線程是通過(guò) Event Loop 來(lái)實(shí)現(xiàn)的。

事件循環(huán)機(jī)制(Event Loop)

它有三個(gè)部分組成:

  • 調(diào)用棧(Call Stack)
  • 消息隊(duì)列(Message Queue)
  • 微任務(wù)隊(duì)列(Microtask Queue)
  1. 首先從全局代碼開(kāi)始,一行行壓入調(diào)用棧中執(zhí)行并彈出,當(dāng)遇到函數(shù)時(shí),函數(shù)中的代碼也被一行行壓入棧頂執(zhí)行完出棧,被壓入的函數(shù)叫做幀(Frame)。當(dāng)所有代碼執(zhí)行完后調(diào)用棧為空。
  2. 執(zhí)行代碼時(shí)遇到 fetch、setTimeOut()、setInterval() 中的回調(diào)函數(shù)會(huì)入隊(duì)到消息隊(duì)列中,然后繼續(xù)往下執(zhí)行代碼,當(dāng)遇到 promise、await、async 時(shí),會(huì)將它們創(chuàng)建的異步操作入隊(duì)到微任務(wù)隊(duì)列中。
  3. 當(dāng)調(diào)用棧清空時(shí)才先將微任務(wù)隊(duì)列中的代碼入棧執(zhí)行,再執(zhí)行消息隊(duì)列中的代碼。
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書(shū)系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容