內(nèi)存釋放(垃圾回收)
1.堆內(nèi)存
對(duì)象數(shù)據(jù)類型或者函數(shù)數(shù)據(jù)類型在定義的時(shí)候都會(huì)開辟一個(gè)堆內(nèi)存空間骗随,堆內(nèi)存有一個(gè)引用地址聘裁,如果外面有變量指向這個(gè)地址,那這個(gè)內(nèi)存就被占用了,則無(wú)法被銷毀迄靠。
如果把所有引用他地址的變量賦值為null秒咨,則堆內(nèi)存釋放/銷毀喇辽。
2.棧內(nèi)存
棧內(nèi)存可以理解為作用域掌挚。
1.全局作用域
只有當(dāng)頁(yè)面關(guān)閉的時(shí)候全局作用域才會(huì)銷毀。
2.私有作用域(函數(shù)執(zhí)行會(huì)產(chǎn)生私有作用域)
一般情況下菩咨,函數(shù)執(zhí)行會(huì)形成一個(gè)新的私有作用域吠式,當(dāng)私有作用域中的代碼執(zhí)行完成之后,我們當(dāng)前的作用域會(huì)主動(dòng)進(jìn)行釋放和銷毀抽米。
內(nèi)存泄漏
JavaScript中最常用的垃圾收集方式是標(biāo)記清除(mark-and-sweep)特占。當(dāng)變量進(jìn)入環(huán)境(例如,在函數(shù)中聲明一個(gè)變量)時(shí)云茸,就將這個(gè)變量標(biāo)記為“進(jìn)入環(huán)境”是目。從邏輯上講,永遠(yuǎn)不能釋放進(jìn)入環(huán)境的變量所占的內(nèi)存标捺,因?yàn)橹灰獔?zhí)行流進(jìn)入相應(yīng)的環(huán)境懊纳,就可能用到它們。而當(dāng)變量離開環(huán)境時(shí)亡容,這將其 標(biāo)記為“離開環(huán)境”嗤疯。
雖然JavaScript 會(huì)自動(dòng)垃圾收集,但是如果我們的代碼寫法不當(dāng)闺兢,會(huì)讓變量一直處于“進(jìn)入環(huán)境”的狀態(tài)茂缚,無(wú)法被回收。
1.全局變量引起的內(nèi)存泄漏
function leaks(){
leak = 'xxxxxx';//leak 成為一個(gè)全局變量屋谭,不會(huì)被回收
}
2.閉包引起的內(nèi)存泄漏
var leaks = (function(){
var leak = 'xxxxxx';// 被閉包所引用脚囊,不會(huì)被回收
return function(){
console.log(leak);
}
})()
覺得寫的不錯(cuò)的小伙伴點(diǎn)贊加關(guān)注哦! (=?ω?=)