?如何理解閉包锚烦?
1、定義和用法:當(dāng)一個函數(shù)的返回值是另外一個函數(shù)帝雇,而返回的那個函數(shù)如果調(diào)用了其父函數(shù)內(nèi)部的其它變量涮俄,如果返回的這個函數(shù)在外部被執(zhí)行,就產(chǎn)生了閉包尸闸。
2彻亲、表現(xiàn)形式:使函數(shù)外部能夠調(diào)用函數(shù)內(nèi)部定義的變量。
3吮廉、實例如下:
(1)苞尝、根據(jù)作用域鏈的規(guī)則,底層作用域沒有聲明的變量宦芦,會向上一級找宙址,找到就返回,沒找到就一直找调卑,直到window的變量抡砂,沒有就返回undefined。這里明顯count 是函數(shù)內(nèi)部的flag2 的那個count 恬涧。
varcount=10;//全局作用域 標(biāo)記為flag1function add(){
? ? varcount=0;//函數(shù)全局作用域 標(biāo)記為flag2return function(){
? ? ? ? count+=1;//函數(shù)的內(nèi)部作用域? ? ? ? alert(count);
? ? }
}vars = add()
s();//輸出1s();//輸出2
4注益、變量的作用域
要理解閉包,首先必須理解Javascript特殊的變量作用域溯捆。
變量的作用域分類:全局變量和局部變量丑搔。
特點:
1、函數(shù)內(nèi)部可以讀取函數(shù)外部的全局變量;在函數(shù)外部無法讀取函數(shù)內(nèi)的局部變量低匙。
2旷痕、函數(shù)內(nèi)部聲明變量的時候,一定要使用var命令顽冶。如果不用的話欺抗,你實際上聲明了一個全局變量!
?5强重、使用閉包的注意點
1)濫用閉包绞呈,會造成內(nèi)存泄漏:由于閉包會使得函數(shù)中的變量都被保存在內(nèi)存中,內(nèi)存消耗很大间景,所以不能濫用閉包佃声,否則會造成網(wǎng)頁的性能問題,在IE中可能導(dǎo)致內(nèi)存泄露倘要。解決方法是圾亏,在退出函數(shù)之前,將不使用的局部變量全部刪除封拧。
2)會改變父函數(shù)內(nèi)部變量的值志鹃。所以,如果你把父函數(shù)當(dāng)作對象(object)使用泽西,把閉包當(dāng)作它的公用方法(Public Method)曹铃,把內(nèi)部變量當(dāng)作它的私有屬性(private value),這時一定要小心捧杉,不要隨便改變父函數(shù)內(nèi)部變量的值陕见。