在JavaScript中,内嵌函數可以通路定義在外層函數中的所有變量和函數,并包括其外層函數能通路的所有變量和函數。但是在函數外部則不能通路函數的内部變量和嵌套函數。
此時就可以使用閉包來實作。
閉包函數指的是有權通路另一函數作用域内變量(局部變量)的函數。
最主要的用途:①可以在函數外部讀取函數内部的變量;②可以讓變量的值始終儲存在記憶體中。
注意:由于閉包會使得函數中的變量一直被儲存在記憶體中,記憶體消耗很大,是以濫用閉包可能會降低程式的處理速度,造成記憶體消耗等問題。
閉包函數的實作
常見的閉包建立方式就是在一個函數内部建立另一個函數,通過另一個函數通路這個函數的局部變量。為了讓大家更加清楚閉包函數的實作,下面通過代碼實作:
function fn() {
var times = 0;
var c = function () {
return ++times;
};
return c;
}
var count = fn (); //儲存fn()傳回的函數,此時count就是一個閉包
//通路測試
console.log(count()); //輸出結果:1
console.log(count()); //輸出結果:2
console.log(count()); //輸出結果:3
console.log(count()); //輸出結果:4
console.log(count()); //輸出結果:5
上述的第3~5行代碼,利用閉包函數實作了在全局作用域中通路局部變量times ,并讓變量的值始終存儲在記憶體中。第8行diamante調用了fn()函數後,接下來将匿名函數的引用傳回給count變量,且匿名函數中使用了局部變量times。是以,局部變量times不會在fn()函數執行完成後被JavaScript回收,依然儲存在記憶體中。