在前端面試中,很多面試管都會問到得概念‘介紹一下閉包’
我們一般從以下三方面來回答:1.閉包是什么,2.閉包優(yōu)點,3.閉包缺點
一、閉包是什么?
閉包就是兩個函數(shù)嵌套,內(nèi)部函數(shù)引用外部函數(shù)變量。
例如:
function a(){
var n=9;
function b(){
alert(n); // 9
}
}
在就常見的for循環(huán),也是常見的閉包。
二 、閉包的優(yōu)點是什么?
1:變量長期駐扎在內(nèi)存中;
2:避免全局變量的污染;
3:私有成員的存在 ;
三、閉包的缺點是什么?
說到閉包的缺點,我查過很多網(wǎng)上文章,統(tǒng)一都說閉包的缺點是內(nèi)存泄漏,這么說其實是沒毛病的,就算面試時候說內(nèi)存泄漏也是可以的,但是具體分析一下,僅僅之說內(nèi)存泄漏是不嚴(yán)謹(jǐn)?shù)摹?br> 前些天看到一本書上對閉包缺點概念總結(jié)如下:
閉包是一個非常強大的特性,但是人們對其也有諸多誤解。一種聳人聽聞的說法是閉包會造成內(nèi)存泄漏,所以要盡量減少閉包的作用。
局部變量本來應(yīng)該在函數(shù)退出的時候被解除引用,但如果局部變量被封閉在閉包形成的環(huán)境中,那么這個局部變量就能一直生存下去。從這個意義上看,閉包的確會使一些數(shù)據(jù)無法被及時銷毀,使用閉包的一部分原因室我們選擇主動把一些變量封閉在閉包中,因為可能在以后還需要使用這些變量,把這些變量放在閉包中和放在全局作用域,對內(nèi)存方面的影響是一致的,這里并不能說成是內(nèi)存泄漏。如果在將來需要回收這些變量,我們可以手動把這些變量設(shè)為null。
跟閉包和內(nèi)存泄漏有關(guān)的地方是:使用閉包的同時比較容易形成循環(huán)引用,如果閉包的作用域鏈中保存著一些DOM節(jié)點,這時候就有可能造成內(nèi)存泄漏。但是這本身并非閉包的問題,也并非javascript的問題。在IE瀏覽器中由于BOM與DOM中的對象是使用C++以COM對象的方式實現(xiàn)的,而COM對象的垃圾回收機制是采用引用計數(shù)策略。在基于引用計數(shù)策略的垃圾回收機制中,如果兩個對象之間形成了循環(huán)引用,那么這兩個對象都無法被回收,但循環(huán)引用造成的內(nèi)存泄漏在本質(zhì)上也不是閉包造成的。
同樣,如果要解決循環(huán)引用帶來的內(nèi)存泄漏問題,我們只需要在循環(huán)引用中的變量設(shè)為null即可。將變量設(shè)置為null意味著切斷變量與它此前引用的值之間的連接。當(dāng)垃圾收集器下次運行時,就會刪除這些值并回收它們占用的內(nèi)存。
個人觀點:
閉包內(nèi)存泄漏也不是不對,如果從代碼上表現(xiàn)上看確實是沒有清除引用,如果從邏輯上看是因為沒有斷開引用鏈接。說閉包又內(nèi)存泄漏也是對的,實際上是代碼邏輯的原因與閉包的關(guān)系并不大。
也許在回答面試管閉包問題的時候,當(dāng)說到缺點的作用上會加分吧。
以上為個人觀點,如果有誤請指正。