什么是閉包?
能夠訪問其他函數內部變量的函數
閉包解決了什么問題
由於變量的作用域的原因-----(函數內部能讀取全局變量,函數外部無法讀取函數內部的變量【局部變量】),為了在函數外部讀取局部變量,所以就有了閉包。
閉包的作用
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
.