堆棧內(nèi)存的作用
JS 中的內(nèi)存堆內(nèi)存和棧內(nèi)存蝌戒,所有堆棧內(nèi)存的處理耿芹,瀏覽器會自行在內(nèi)部執(zhí)行
棧內(nèi)存:
- 提供一個(gè)供 JS 代碼自上而下執(zhí)行的環(huán)境(作用域,代碼都是在棧內(nèi)存中執(zhí)行的)
- 由于基本類型比較簡單俭正,它們都是直接在棧內(nèi)存中開辟一個(gè)位置驯遇,直接把值存儲進(jìn)去的
堆內(nèi)存:引用值對應(yīng)的空間
存儲引用類型的(對象:鍵值對,函數(shù):代碼字符串)
堆內(nèi)存的釋放
讓所有引用堆內(nèi)存空間地址的變量賦值為 null
即可捎琐,當(dāng)堆內(nèi)存沒有被任何的變量或者其他東西引用時(shí)抑钟,就會在瀏覽器執(zhí)行垃圾回收的時(shí)候,被銷毀掉野哭。
堆內(nèi)存釋放后在塔,里面存儲的值也就會被釋放掉。
棧內(nèi)存的釋放
全局作用域會在頁面關(guān)閉或者刷新的時(shí)候釋放拨黔。(棧內(nèi)存釋放后蛔溃,存儲在棧內(nèi)存中的值也都會銷毀。
)
私有作用域:一般情況下篱蝇,當(dāng)函數(shù)執(zhí)行完成贺待,所形成的私有作用域(棧內(nèi)存)都會自動釋放掉,但是也有特殊的情況零截。
函數(shù)執(zhí)行完成麸塞,當(dāng)前形成的棧內(nèi)存中,某些內(nèi)容被棧內(nèi)存意外的變量一直占用涧衙,此時(shí)棧內(nèi)存不能釋放哪工,棧內(nèi)存中存儲的基本值也不會被釋放,一直保存下來弧哎。最典型的就是閉包雁比。
var i = 1;
function fn(i) {
return function(n) {
console.log(n + (++i));
}
}
var f = fn(2); //=> i = 2
f(3); //=>7, i = 2 n =3,執(zhí)行 n + (++i) => 3 + 3 = 6
fn(5)(6); //=>12, i = 5 n = 6撤嫩,執(zhí)行 n + (++i) => 6 + 6 = 12
fn(7)(8); //=>16, i = 7 n = 8偎捎,執(zhí)行 n + (++i) => 8 + 8 = 16
f(4); //=>8, i = 3 n = 4,執(zhí)行 n + (++i) => 4 + 4 = 8