javascript的預解釋-作用域-內存的釋放

作用域鏈:
當函數被調用的時候,會形成一個私有作用域,看私有作用域中,是否存在私有變量A:
1)如果有私有變量A:那么整個作用域中的A,跟外界沒有任何關系;所有該作用域中的A,都是私有變量;
2)如果沒有私有變量A:就會往上級作用域進行查找,找到的話,直接用,找不到繼續找,一直找到window還沒有,就會報錯!;
私有變量有兩種:
①當前作用域下帶var的;
②形參;

堆內存的釋放

對象數據類型或者函數數據類型在[定義]的時候首先都會開辟一個堆內存,堆內存又有一個引用的地址,如果外面有變量等知道了這個地址,我們就說這個內存被占用了,就不能銷毀了。
"var obj1 = {};
var obj2 = obj1;"
我們想要讓堆內存釋放/銷毀,只需要把所有引用它的變量值賦值為null就可以,如果當前的堆內存沒有任何東西被占用了,那么瀏覽器會在空閑的時候把它銷毀...(也叫垃圾回收)
"obj1 = null;
obj2 = null;"

棧內存

全局作用域 全局作用域不銷毀,只有當頁面關閉的時候全局作用域才會銷毀。
私有作用域
(只有函數執行會產生私有作用域)
1、當代碼執行完成后,我們當前作用域都會主動的進行釋放和銷毀。
2、但是,還是存在特殊情況的:
a、當私有作用域中的部分內存被作用域以外的東西占用了,那么當前的這個作用域就不能銷毀了。
例子:1)函數執行返回了一個引用數據類型的值,并且在函數外面被一個其他的東西給接收了,這種情況下一般形成的私有作用域都不會被銷毀。
"function fn() {

var num=100;
return function fn(){
    num++;

}

}
fn();" 這個函數是銷毀。
function fn(){
var num=1000;
return function(){
}
}
var f=fn(); //fn執行形成的這個私有作用域就不在銷毀了。

"function fn() {
var num=100;
return 10;
}
var f=fn();" //私有作用域就可以銷毀了

function fn() {
var num=100;
return function (){
alert(1);

};

}
fn()();
/這種情況屬于不立即銷毀-->fn返回的函數沒有被其他的東西占用,但是還需要執行一次在被銷毀。

2、在一個私有作用域中給DOM元素的事件綁定方法,一般情況下我們的私有作用域,都不銷毀。

var oDiv = document.getElementById("div1");

!function (){
    oDiv.onclick =function(){

    }
}();//當前自執行函數形成的這個私有作用域也是不可以銷毀 

總結

函數能被銷毀的情況:
1函數最后的值是一個值,不再調用此函數了,就可以被銷毀。
不能被銷毀的情況:
1函數里有全局變量。
2函數有事件發生,不能被銷毀,
3函數最后的值還是函數,不能被銷毀。

最后編輯于
?著作權歸作者所有,轉載或內容合作請聯系作者
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發布,文章內容僅代表作者本人觀點,簡書系信息發布平臺,僅提供信息存儲服務。

推薦閱讀更多精彩內容

  • 三、閉包和高階函數 3.1 閉包 3.1.1 變量的作用域 所謂變量的作用域,就是變量的有效范圍。通過作用域的劃分...
    梁同學de自言自語閱讀 1,494評論 0 6
  • 介紹 JavaScript中有一個被稱為作用域(Scope)的特性。雖然對于許多新手開發者來說,作用域的概念并不是...
    安_6dd1閱讀 988評論 0 8
  • 工廠模式類似于現實生活中的工廠可以產生大量相似的商品,去做同樣的事情,實現同樣的效果;這時候需要使用工廠模式。簡單...
    舟漁行舟閱讀 7,854評論 2 17
  • 修心,靜心,用心,知心,開心。常懷五心 萬物存在皆有理,唯有自心擇而行。 無可奈何人老去,似曾相識不復來。 靜坐忘...
    旋轉的葉輪閱讀 223評論 0 0
  • jQuery動畫具有按序列執行的特點,即第一個動畫執行完會繼續執行后續動畫,好多時候,我們都需要停止當前動畫,或立...
    sky丶星如雨閱讀 685評論 0 0