原創聲明:本文為作者原創,未經允許不得轉載,經授權轉載需注明作者和出處
何為閉包,所謂閉包就是在一個函數內創建一個新函數,通過這個函數來調用外面的局部變量,主要是為了設計私有的方法和變量,使用閉包會增大內存使用量,使用不當很容易造成內存泄露,但是可以避免全局變量的污染
function out() {
var a = 1;
return function(a){//使用匿名函數實現局部變量駐留內存中,從而實現累加
return a++;
};
}
var fun = out();
fun();// 1 執行后 ++a,,然后a還在~
fun();// 2
fun = null;//a被回收
閉包的變量如果不被收回,那么會一直存在,消耗內存
在如上的例子中,我們會發現,一個函數套用了一個函數,所以我們有時候會看到如下的調用方法 fun()();
如果以上面的代碼為例,那么
var fun=out();
console.log(fun); //輸出function(){return a++; }; 說明out()=被返回的函數
var fun=out()();
console.log(fun); //輸出1,說明out()()=最內部被返回的值
這是因為函數內另一個函數也是作為返回的值而存在,所以我們可以直接通過這樣的方法來調用內部返回函數,那么如果是var fun=out()(2);
那么返回值是什么呢,如果在全局里定義一個var a=3;
是不感覺到迷惑了,其實這里有個小技巧,當一個變量被返回之后,會被返回給離他最近的一個相同名稱的變量. 這句話是我總結的,如果不對,還請指出
私有成員
var out = (function(){ //使用匿名函數
var a = 1; //定義私有變量
function fir(){ //私有函數
return a++;
}
function sec(){
return a++;
}
return {
a:fir, //使用json結構來儲存函數并返回
b:sec
}
})();
out.b(); //2
out.c() //3