閉包定義
在一個函數內部創建另一個函數,通過另一個函數訪問這個函數的局部變量。即能夠讀取其它函數內部變量的函數。
閉包實例
// 有如下函數:
// sum(2,3) //結果是5
// sum(2)(3) //結果是5
// 請寫出sum函數的具體怎麼實現
function sum(i) {
if(arguments.length == 2) {
return(arguments[0] + arguments[1]);
}
else {
return function sum1(j) {
return i + j;
}
}
}
console.log(sum(2, 3));
console.log(sum(2)(3));
注意
函數帶()纔是執行函數,纔會被調用,單純
var fun = function() {
alert("hello world");
}
是不會彈窗的,只有調用fun()纔會彈窗。
閉包的優勢
1、能夠讀取函數內部的變量
2、閉包使用的局部變量會一直存在於內存中,不會在調用結束後,被垃圾回收機制回收
閉包的劣勢
1、由於閉包會使函數中的變量保存在內存中,內存消耗很大,所以不能濫用閉包,否則會造成網頁的性能問題。
解決辦法是,退出函數之前,將不使用的局部變量刪除。
利用閉包實現局部變量的累加
由於
1.調用函數時,爲局部變量開闢內存;函數調用結束時,局部變量內存立刻被釋放掉。
2. 全局變量是公共的,容易發生問題。
但閉包使用的局部變量不會被立刻釋放掉,會在內存中駐留一段時間,很好的解決了a,b。
變量累加舉例:
function add () {
var age=10;
return function(){
age++;
return age;
}
}
var fun=add();
console.log(fun()); //11
console.log(fun()); //12
console.log(fun()); //13