什么是閉包,閉包造成的內存泄露如何解決


什么是閉包?
能夠訪問其他函數內部變量的函數

閉包解決了什么問題
由於變量的作用域的原因-----(函數內部能讀取全局變量,函數外部無法讀取函數內部的變量【局部變量】),為了在函數外部讀取局部變量,所以就有了閉包。

閉包的作用
1.訪問其他函數內部變量
2.保護變量不被內存回收機制回收
3.避免全局變量被污染 方便調用上下文的局部變量 加強封裝性

閉包的缺點
閉包長期占用內存,內存消耗很大,可能導致內存泄露

閉包示例代碼

function outer(){
        var m = 2;
        function inner(){
            console.log(m)
        }
        return inner;
    }
let func = outer();
func()                                    //打印2

 

 

注意事項,如若操作不當,可能會導致內存泄漏。

什么是內存泄漏
首先,需要了解瀏覽器自身的內存回收機制。
每個瀏覽器會有自己的一套回收機制,當分配出去的內存不使用的時候便會回收;內存泄露的根本原因就是你的代碼中分配了一些‘頑固的’內存,瀏覽器無法進行回收,如果這些’頑固的’內存還在一直不停地分配就會導致后面所用內存不足,造成泄露。

閉包造成內存泄漏
因為閉包就是能夠訪問外部函數變量的一個函數,而函數是必須保存在內存中的對象,所以位於函數執行上下文中的所有變量也需要保存在內存中,這樣就不會被回收,如果一旦循環引用或創建閉包,就會占據大量內存,可能會引起內存泄漏)

如何避免閉包引起的內存泄漏
1,在退出函數之前,將不使用的局部變量全部刪除。可以使變量賦值為null;(示例如下)

 這段代碼會導致內存泄露
    window.onload = function(){
        var el = document.getElementById("id");
        el.onclick = function(){
            alert(el.id);
        }
    }
    解決方法為
    window.onload = function(){
        var el = document.getElementById("id");
        var id = el.id;                                      //解除循環引用
        el.onclick = function(){
            alert(id); 
        }
        el = null;                                          // 將閉包引用的外部函數中活動對象清除
    }

 

 

2,避免變量的循環賦值和引用。 (示例如上)

3,利用Jquery釋放自身指定的所有事件處理程序。
由於jQuery考慮到了內存泄漏的潛在危害,所以*它會手動釋放自己指定的所有事件處理程序 *。只要堅持使用jQuery的事件綁定方法,就可以一定程度上避免這種特定的常見原因導致的內存泄漏。

這段代碼會導致內存泄露
$(document).ready(function() {
    var button = document.getElementById('button-1');
    button.onclick = function() {
         console.log('hello');
         return false;
    };
});

當指定單擊事件處理程序時,就創建了一個在其封閉的環境中包含button變量的閉包。而且,現在的button也包含一個指向閉包(onclick屬性自身)的引用。這樣,就導致了在IE中即使離開當前頁面也不會釋放這個循環。

用jQuery化解引用循環
$(document).ready(function() {
    var $button = $('#button-1');
    $button.click(function(event) {
        event.preventDefault();
        console.log('hello');
    });
});

參考鏈接: https://blog.csdn.net/liuzijiang1123/article/details/81226797
參考鏈接:https://www.cnblogs.com/yakun/p/3932026.html

 

 

 

 

 

 

.


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM