閉包會形成內存泄漏嗎?

閉包會形成內存泄漏嗎? 不會!!!

發現網上一堆閉包的教程都說閉包會形成內存泄漏,特地去查了下書,發現這一直是一個誤解。javascript

js高程原文這樣說的:因爲IE9 以前的版本對JScript 對象和COM 對象使用不一樣的垃圾收集。所以閉包在IE 的這些版本中會致使一些特殊的問題。具體來講,若是閉包的做用域鏈中保存着一個HTML 元素,那麼就意味着該元素將沒法被銷燬。html

意思就是閉包形成的內存泄漏是舊版本IE的bug,真正狀況下的閉包不會形成內存泄漏。java

下面是修復舊版本IE內存泄漏的方法:閉包

function assignHandler(){
    var element = document.getElementById("someElement");
    element.onclick = function(){
        alert(element.id);
    };
}

以上代碼建立了一個做爲element 元素事件處理程序的閉包,而這個閉包則又建立了一個循環引用。因爲匿名函數保存了一個對assignHandler()的活動對象的引用,所以就會致使沒法減小element 的引用數。只要匿名函數存在,element 的引用數至少也是1,所以它所佔用的內存就永遠不會被回收,這是IE的問題,因此閉包和內存泄漏沒半毛錢關係。函數

解決辦法前言已經提到過,把element.id 的一個副本保存在一個變量中,從而消除閉包中該變量的循環引用同時將element變量設爲null。性能

function assignHandler(){
    var element = document.getElementById("someElement");
    var id = element.id;
    element.onclick = function(){
        alert(id);
    };
    element = null;
}

總結:閉包並不會引發內存泄漏,只是因爲IE9 以前的版本對JScript對象和COM對象使用不一樣的垃圾收集,從而致使內存沒法進行回收。學習

使用閉包的注意點spa

1)因爲閉包會使得函數中的變量都被保存在內存中,內存消耗很大,因此不能濫用閉包,不然會形成網頁的性能問題,在IE中可能致使內存泄露。解決方法是,在退出函數以前,將不使用的局部變量所有刪除。code

2)閉包會在父函數外部,改變父函數內部變量的值。因此,若是你把父函數看成對象(object)使用,把閉包看成它的公用方法(Public Method),把內部變量看成它的私有屬性(private value),這時必定要當心,不要隨便改變父函數內部變量的值。htm

參考:學習Javascript閉包(Closure)- 阮一峯

相關文章
相關標籤/搜索