了解閉包前,先了解變量:局部變量和全局變量。
var m = 100;
function f1(){
console.log(m);
}
f1() // 100
//m為全局變量
function f2(){
var n = 100;
}
f2();
console.log(n); //Uncaught ReferenceError: n is not defined
//n為局部變量
// ps:如果在函數(shù)里面,沒有用var,實際上是定義了一個全局變量。如下:
function f3(){
j = 100;
}
f3();
console.log(j); //100
//j為全局變量
接下來的問題是,如何從外部獲取局部變量:
function f4(){
var k = 100;
function f5(){
alert(k);
}
return f5;
}
f4()() //100
如上,f5可以讀取f4中的局部變量,那么只要把f5作為返回值,我們就可以在f4外部讀取它的內(nèi)部變量(k)。f5就是閉包。
閉包的用途 :
閉包可以用在許多地方。它的最大用處有兩個,一個是可以讀取函數(shù)內(nèi)部的變量,另一個就是讓這些變量的值始終保持在內(nèi)存中。
使用閉包的注意點:
1.由于閉包會使得函數(shù)中的變量都被保存在內(nèi)存中,內(nèi)存消耗很大,所以不能濫用閉包,否則會造成網(wǎng)頁的性能問題,在IE中可能導致內(nèi)存泄露(內(nèi)存泄漏是指程序中己動態(tài)分配的堆內(nèi)存由于某種原因程序未釋放或無法釋放,造成系統(tǒng)內(nèi)存的浪費,導致程序運行速度減慢甚至系統(tǒng)崩潰等嚴重后果。)。解決方法是,在退出函數(shù)之前,將不使用的局部變量全部刪除。
2.閉包會在父函數(shù)外部,改變父函數(shù)內(nèi)部變量的值。
注意:
閉包并不會引起內(nèi)存泄漏,只是由于IE9之前的版本對JScript對象和COM對象使用不同的垃圾收集,從而導致內(nèi)存無法進行回收,這是IE的問題,所以閉包和內(nèi)存泄漏沒半毛錢關系。具體看這篇文章