?如何理解閉包?
1、定義和用法:當一個函數(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;//全局作用域 標記為flag1function add(){
? ? varcount=0;//函數(shù)全局作用域 標記為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中可能導致內(nèi)存泄露。解決方法是,在退出函數(shù)之前,將不使用的局部變量全部刪除。
2)會改變父函數(shù)內(nèi)部變量的值。所以,如果你把父函數(shù)當作對象(object)使用,把閉包當作它的公用方法(Public Method),把內(nèi)部變量當作它的私有屬性(private value),這時一定要小心,不要隨便改變父函數(shù)內(nèi)部變量的值。