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