物件資料型別和函式資料型別在定義的時候首先會開闢乙個堆記憶體,堆記憶體有乙個引用位址,如果外面有變數已經知道了該引用位址,則會說該記憶體已經被占用了,那麼這個記憶體就不能夠被銷毀了。
那為了保證瀏覽器的效能,瀏覽器有時如何釋放記憶體的?
1、對於堆記憶體的釋放,是通過null操作來銷毀記憶體的,只要把所有引用了這個堆記憶體的變數值賦值為null即可,使得當前的堆記憶體沒有任何東西占用了,那瀏覽器會在空閒的時候將該堆記憶體銷毀。
2、對於棧記憶體,主要是指全域性作用域和私有作用域。
(私有作用域只有當函式被執行的時候會產生,對於for語句、if語句和switch語句等都不會產生記憶體的)
2.1 全域性作用域是什麼時候被瀏覽器銷毀的?
全域性作用域只有當瀏覽器頁面關閉的時候才會關閉。
2.2 私有作用域是在什麼時候被瀏覽器銷毀的?
一般情況下,函式執行會形成乙個新的私有作用域,當私有作用域中的**全部執行完畢後,我們的當前私有作用域會自動進行釋放和銷毀,當該函式再次被執行時,又會重複建立乙個新的私有作用域,然後執行完畢後有銷毀,如此重複。
3、但是也有特殊情況使得私有作用域成為不被銷毀或者暫時不銷毀的私有作用域,
當私有作用域中的部分內容被作用域以外的東西占用了,那麼當前的私有作用域就不能銷毀。
如:
在圖中的記憶體a就不能被銷毀,因為f已經占用了a中部分,也就是說a中的堆記憶體被a以外的占用了,那***fff111堆記憶體就不能釋放,對應的a這個私有作用域也不能被銷毀了,裡面的私有變數num也不會被銷毀。
主要有以下幾種情況會發生記憶體不能被銷毀:
a、函式執行後返回乙個引用資料型別值,並且在函式的外面被乙個其他東西給接收了,這種情況下形成的私有作用域都不會被銷毀。
例子:
functionfn() }
varf=
fn();
// ===>fn執行時形成的私有作用域不能被銷毀
b、在私有作用域中給dom事件繫結方法,一般情況下的這個私有作用域也不會被銷毀。
例子:
varobj=document.getelementsbyclassname("d");~function()
}(); //===>這個自執行函式的私有作用域也不能被銷毀。
圖分析如下:
c、以下情況屬於不立即銷毀記憶體情況,因為fn返回的函式沒有被其他東西占用,但是還是需要執行一次,所以會暫時不銷毀,當返回
的值執行完成後,瀏覽器會在空閒的時候銷毀。
functionfn()}
fn()();
4、相關練習題:
題一:
functionfn()}varf= fn();
f(10);//21
f(20);//32
fn()(10);//21
fn()(20);//31
輸出結果:結果分析:
題二:
functionfn(i)}varf= fn(13);
f(12);//25
f(14);//28
fn(15)(12);//27
fn(16)(23);//39
結果:PHP unset銷毀變數並釋放記憶體
php的unset 函式用來清除 銷毀變數,不用的變數,我們可以用unset 將它銷毀。但是某些時候,用unset 卻無法達到銷毀變數占用的記憶體!我們先看乙個例子 s str repeat 1 255 產生由255個1組成的字串 m memory get usage 獲取當前占用記憶體 unset...
php unset銷毀變數並釋放記憶體
php的unset 函式用來清除 銷毀變數,不用的變數,我們可以用unset 將它銷毀。但是某些時候,用unset 卻無法達到銷毀變數占用的記憶體!我們先看乙個例子 s str repeat 1 255 產生由255個1組成的字串 m memory get usage 獲取當前占用記憶體 unset...
PHP unset銷毀變數並釋放記憶體
php的unset 函式用來清除 銷毀變數,不用的變數,我們可以用unset 將它銷毀。但是某些時候,用unset 卻無法達到銷毀變數占用的記憶體!我們先看乙個例子 s str repeat 1 255 產生由255個1組成的字串 m memory get usage 獲取當前占用記憶體 unset...