什么是閉包?以及對閉包缺點詳解

在前端面試中,很多面試管都會問到得概念‘介紹一下閉包’
我們一般從以下三方面來回答: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)說到缺點的作用上會加分吧。

以上為個人觀點,如果有誤請指正。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

友情鏈接更多精彩內(nèi)容