1.堆內存
對象數據類型或者函數數據類型在定義的時候首先會開辟一個堆內存,堆內存有一個引用的地址,如果外面有變量等於了這個地址,我們就說這個內存被占用了,就不能銷毀了
我們想要讓堆內存釋放/銷毀,只要把所有引用它的變量賦值為null即可,如果當前的堆內存沒有任何東西被占用了,那么瀏覽器會在空閑的時候把它銷毀...
2.棧內存
1)全局作用域
只有當頁面關閉的時候全局作用域才會銷毀
2)私有作用域(只有函數執行會產生私有的作用域)
一般情況下,函數執行會形成一個新的私有作用域,當私有作用域中的代碼中下完成后,我們當前作用域都會主動的進行釋放和銷毀
但是還是存在特殊的情況:
當前私有作用域中的部分內存被作用域 意外的 東西占用了,那么當前的這個作用域就不能銷毀了
a.函數執行返回了一個引用數據類型的值並且在函數的外面被一個其他的東西給接收了,這種情況下一般,這種情況下一般形成的私有作用域都不會被銷毀
function fn(){ var num = 100; return function(){ } } var f = fn();//fn執行形成的這個私有的作用域就不能再銷毀了
b.在一個私有的作用域中給DOM元素的事件綁定方法,一般情況下我們的私有作用域都不銷毀
var oDiv = document.getElementById("div1"); ~function(){ oDiv.onclick = function (){ } }();//當前自執行函數形成的這個私有的作用域也不銷毀
c.
function fn(){ var num = 100; return function(){ } } fn()();//首先執行fn,返回一個小函數對應的內存地址,然后緊接着讓返回的小函數再執行,不立即銷毀