閉包指的是一個函數(shù)可以訪問另一個函數(shù)作用域中變量。常見的構(gòu)造方法,是在一個函數(shù)內(nèi)部定義另外一個函數(shù)。內(nèi)部函數(shù)可以引用外層的變量;外層變量不會被垃圾回收機制回收。
注意,閉包的原理是作用域鏈,所以閉包訪問的上級作用域中的變量是個對象,其值為其運算結(jié)束后的最后一個值。
優(yōu)點:避免全局變量污染。缺點:容易造成內(nèi)存泄漏(變量都被保存在內(nèi)存中)。
閉包的使用場景:封裝組件,函數(shù)引用類型,定義私有數(shù)據(jù)
特性:
a. JavaScript允許你使用在當前函數(shù)以外定義的變量
b. 即使外部函數(shù)已經(jīng)返回,當前函數(shù)仍然可以引用在外部函數(shù)所定義的變量
c. 閉包可以更新外部變量的值
d. 用閉包模擬私有方法
由于閉包會使得函數(shù)中的變量都被保存在內(nèi)存中,內(nèi)存消耗很大,所以不能濫用閉包,否則會造成網(wǎng)頁的性能問題
例子:
function makeFunc() {
var name = "Mozilla";
function displayName() {
console.log(name);
}
return displayName;
}
var myFunc = makeFunc();
myFunc(); //輸出Mozilla