function fun(n,o) {
console.log(o)
return {
fun:function(m){
return fun(m,n);
}
};
}
var a = fun(0); a.fun(1); a.fun(2); a.fun(3); //undefined 0 0 0
var b = fun(0).fun(1).fun(2).fun(3); //undefined 0 1 2
var c = fun(0).fun(1); c.fun(2); c.fun(3); //undefined 0 1 1
最外層的fn()和最里層的fun()屬于一個(gè)函數(shù)缤至,而第二個(gè)fun是另一個(gè)新的函數(shù)厉斟。(注明:所有聲明的匿名函數(shù)都是一個(gè)新函數(shù))欧聘。
1.當(dāng)a=fun(0),相當(dāng)于n=0,而o沒(méi)有傳值捂蕴,所以console出來(lái)是undefined靡挥;
a.fun(1),由于閉包序矩,此時(shí)n=0依然存在,執(zhí)行fun(0,undefined).fun(1)
,返回fun(m,n)跋破,此時(shí)傳值m=1簸淀,n=0瓶蝴,此時(shí)console出來(lái)的值為0;同理a.fun(2)和a.fun(3)相當(dāng)于fun(2,0)和fun(3,0),所以打印出來(lái)的都是0租幕。
2.當(dāng)b= fun(0),和第一個(gè)一樣舷手,都是沒(méi)有給o傳值,因此為undefined;
.fun(1)同上面第二個(gè)是一樣的劲绪,所以打印出來(lái)也是0男窟;
fun(0).fun(1).fun(2),此時(shí)返回的函數(shù)是第二次執(zhí)行的返回對(duì)象,所以此時(shí)n的值為1贾富,m值為2歉眷,相當(dāng)于fun(2,1)颤枪,所以打印出來(lái)的值為1汗捡;
fun(0).fun(1).fun(2).fun(3),此時(shí)n值變?yōu)?畏纲,m值為3扇住,相當(dāng)于fun(3,2)盗胀,所以打印出來(lái)的值為2艘蹋。
3.當(dāng)c=fun(0),和前面同理,因此為undefined;
fun(0).fun(1)同上面第二個(gè)是一樣的票灰,所以打印出來(lái)也是0女阀;
c.fun(2),此時(shí)n=1,m=2,fun(2,1),所以打印出來(lái)的值為1屑迂;
c.fun(3),此時(shí)n=1,m=3强品,fun(3,1),所以打印出來(lái)的值為1;
什么是閉包:
1.函數(shù)內(nèi)部的函數(shù)屈糊;
2.有權(quán)訪(fǎng)問(wèn)另一個(gè)函數(shù)作用域變量的函數(shù)的榛;
3.閉包會(huì)使變量被引用不能被垃圾回收機(jī)制收回,所以如果該變量不再用逻锐,請(qǐng)手動(dòng)釋放,可以將值設(shè)置為null夫晌,避免發(fā)生內(nèi)存泄漏。
閉包是將函數(shù)內(nèi)部和函數(shù)外部連接起來(lái)的橋梁昧诱。
用處:
1.讀取函數(shù)內(nèi)部的變量晓淀;
2.這些變量的值始終保持在內(nèi)存中,不會(huì)在外層函數(shù)調(diào)用后被自動(dòng)清除盏档。
閉包的好處:
1:希望一個(gè)變量長(zhǎng)期駐扎在內(nèi)存中凶掰;
2:避免全局變量的污染;
3:私有成員的存在 。