作用域鏈:
當函數被調用的時候,會形成一個私有作用域,看私有作用域中,是否存在私有變量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函數最后的值還是函數,不能被銷毀。