標籤:垃圾 擷取 min ons 代碼 需要 script 記憶體回收機制 特色
閉包(closure)是Javascript語言的一個痛點,也是它的特色,很多進階應用程式都要依靠閉包實現。
要學習閉包最先需要學習js的變數範圍(第一節教程已經講過),變數的範圍無非就是兩種:全域變數和局部變數。
js 語言的特殊之處,就在於函數內部可以直接讀取全域變數。另一方面,在函數外部自然無法讀取函數內的局部變數。
<script type="text/javascript">
function test1(){
var name = "xiaoming";
function getNames(){
return name;//擷取內部變數
}
return getNames();
}
var otherName= test1();
console.log(otherName);
</script>
閉包可以用在許多地方。它的最大用處有兩個,一個是前面提到的可以讀取函數內部的變數,另一個就是讓這些變數的值始終保持在記憶體中。請看下面的代碼:
<script type="text/javascript">
function test(){
var num=2;
function getNum(){
num++;
return num;
}
return getNum;
}
var names=test();
var nums=names();
console.log(nums);
nums=names();
console.log(nums);
</script>
輸出2,3
在這段代碼中,fun實際上就是閉包funIn函數。它一共運行了兩次,第一次的值是2,第二次的值是3。這證明了,函數test中的局部變數num一直儲存在記憶體中,並沒有在test調用後被自動清除。
為什麼會這樣呢?原因就在於test是funIn的父函數,而funIn被賦給了一個全域變數(var fun),這導致funIN始終在記憶體中,而funIn的存在依賴於test,因此test也始終在記憶體中,不會在調用結束後被記憶體回收機制回收。
JavaScript 閉包(Closure)