一、概述
?什么是閉包雁刷?MDN中第一句話就是
A closure is the combination of a function and the lexical environment within which that function was declared
?也就是說closure=function+lexical environment,lexical environment即是function聲明的地方,然而這并不容易理解甩卓,或者說有點(diǎn)概念化凌节,之后又參考了幾篇文章,終于初步理解了閉包亚隅。
二硼莽、常見閉包
?我們通常見到的閉包往往是這樣的,例一:
function exam(){
var a=3
function fn(){ //closure
alert(a)
}
fn()
}
?也就是說閉包常以函數(shù)嵌套的方式出現(xiàn)煮纵,但是根據(jù)閉包的定義懂鸵,以下例子也是閉包,例二:
var a=3
function(){ //closure
return a
}
?那么為什么我們常見的是第一種嵌套函數(shù)樣式的閉包呢行疏?原因就在于閉包的用途匆光,我們有時(shí)需要隱藏一個(gè)變量,但是又不能完全不可引用酿联,這個(gè)時(shí)候就用到了閉包终息。
?如同例一中的a,在全局環(huán)境中本無法直接訪問到夺巩,但是我們通過閉包,外界環(huán)境就可以訪問到a,這里exam()的存在事實(shí)上只是使a變成了局部變量而已周崭,也就是說柳譬,例三:
!function(){
a=3
function fn(){
alert(a)
}
fn()
}()
?使用一個(gè)立即執(zhí)行的外層函數(shù)實(shí)際上可以達(dá)到同樣的效果。
三休傍、重要特性
?閉包有一個(gè)重要特性征绎,即是狀態(tài)的保持,我們知道磨取,普通函數(shù)是不會(huì)保存狀態(tài)的人柿,如,例四:
function fn(){
var a=0;
console.log(++a);
}
fn(); //1
fn(); //1
fn(); //1
?顯然忙厌,這里的fn函數(shù)無論調(diào)用多少次都是輸出1凫岖,下一個(gè)例子,例五:
function fn(){
var a=0;
return function(){ //closure
console.log(++a);
}
}
var aFn=fn();
aFn(); //1
aFn(); //2
aFn(); //3
?例五中每調(diào)用一次逢净,原來的a就加了1哥放,這就說明原來的fn中return的匿名函數(shù)的所處環(huán)境被保留了(即使此時(shí)fn本身已經(jīng)被清除了),說明aFn自己保持了他所處環(huán)境(lexical environment)的引用爹土。
四甥雕、總結(jié)
?說了這么多我感覺概念性的東西太容易把人繞暈,可能我們經(jīng)常在使用它的時(shí)候反而沒那么在意閉包的概念胀茵,值得一提的是個(gè)人認(rèn)為閉包的狀態(tài)保持是一個(gè)很有意思的東西社露。