JavaScript 閉包(Closure)
閉包(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)