堆內(nèi)存釋放:
? ? ? ? 1群扶、對(duì)象數(shù)據(jù)類型或者函數(shù)數(shù)據(jù)類型在定義的時(shí)候都會(huì)開(kāi)辟一個(gè)堆內(nèi)存透葛,堆內(nèi)存內(nèi)有一個(gè)引用地址笨使,如果地址被變量引用了,那么相應(yīng)的內(nèi)存就被占有僚害,就不能釋放了硫椰。
? ? ? ? 2、通過(guò)將變量賦值為null(空對(duì)象指針)或其他非引用類型贡珊,那么之前定義的對(duì)象或函數(shù)就沒(méi)被占用最爬,那么瀏覽器就會(huì)在空余的時(shí)候釋放內(nèi)存涉馁。
棧內(nèi)存釋放:
? ? ? ? 1门岔、棧內(nèi)存包括了全局作用域和函數(shù)作用域
? ? ? ? ? ? ? (1)全局作用域在瀏覽器加載頁(yè)面的時(shí)候產(chǎn)生,在瀏覽器關(guān)閉時(shí)全局作用域棧內(nèi)存被釋放烤送。
? ? ? ? ? ? ? (2)函數(shù)在執(zhí)行時(shí)產(chǎn)生一個(gè)私有作用域寒随,函數(shù)在預(yù)編譯和執(zhí)行完畢后,一般會(huì)銷(xiāo)毀作用域帮坚,釋放棧內(nèi)存妻往;但存在特殊的情況:當(dāng)前作用域的部分內(nèi)存被作用域以外的變量所占用,那么當(dāng)前的作用域就不會(huì)被銷(xiāo)毀试和。
? ? ? ? ? ? ? ? ? (a)函數(shù)執(zhí)行返回一個(gè)引用數(shù)據(jù)類型的值讯泣,并且值被函數(shù)外的變量接收,這種情況下私有作用域一般不會(huì)被銷(xiāo)毀阅悍。
? ? ? ? ? ? ? ? ? (b)函數(shù)返回一個(gè)函數(shù)緊接著被調(diào)用好渠,這時(shí)函數(shù)作用域“不會(huì)立即銷(xiāo)毀”,如圖:
? ? ? ? ? ? ? ? ? ?(c)通過(guò)DOM方法獲得的元素或元素集都是對(duì)象數(shù)據(jù)類型节视,通過(guò)給元素綁定事件函數(shù)拳锚,事件函數(shù)的父級(jí)私有作用域不會(huì)被銷(xiāo)毀。
? ? ? ? ? ? ? ? ?(d)形成閉包:1寻行、函數(shù)執(zhí)行返回一個(gè)函數(shù)霍掺,并且值被函數(shù)外的變量接收,這時(shí)返回的函數(shù)的作用域鏈不銷(xiāo)毀拌蜘,內(nèi)部函數(shù)擁有訪問(wèn)父級(jí)函數(shù)的權(quán)限杆烁,可以使用父級(jí)的作用域的變量,這時(shí)就形成了閉包简卧,這是函數(shù)模式的閉包连躏;2、函數(shù)內(nèi)定義的函數(shù)沒(méi)被返回贞滨,當(dāng)內(nèi)部函數(shù)使用了父級(jí)的變量也會(huì)形成閉包(可以在控制臺(tái)查看閉包信息)入热;3拍棕、函數(shù)內(nèi)定義的對(duì)象被返回,且對(duì)象使用了函數(shù)作用域的變量勺良,這樣也形成閉包绰播,這被稱為對(duì)象模式的閉包。
? ? ? ? ? ? ? ? ? ? ? 閉包副作用:閉包會(huì)造成原有作用域鏈不釋放尚困,造成內(nèi)存泄露蠢箩。
? ? ? ? ? ? ? ? ? ? ? 閉包作用:如圖