記憶體洩漏指的是當一個物件不起作用時應該被回收時卻因為另一個物件對它的引用而導致它不能被回收,留在了堆記憶體中就稱為記憶體洩漏。常見的有意外全域變量,DOM洩漏以及循環引用等
#【推薦課程:##JavaScript教學】
記憶體洩漏
常見的記憶體洩漏:
1、意外的全域變數
Js處理未定義變數的方式:未定義的變數會在全域物件建立一個新變量,在瀏覽器中,全域物件是window。function foo(arg) { bar = "this is a hidden global variable"; //等同于window.bar="this is a hidden global variable" this.bar2= "potential accidental global";//这里的this 指向了全局对象(window), 等同于window.bar2="potential accidental global"}
2、DOM洩漏
在瀏覽器中DOM和JS所採用的引擎是不一樣的,DOM採用的是渲染引擎,而JS採用的是v8引擎,所以在用JS操作DOM時會比較耗費效能,所以為了減少DOM的操作,我們會採用變數引用的方式會將其快取在目前環境。如果在進行一些刪除、更新操作之後,可能會忘記釋放已經快取的DOM因此造成了記憶體洩漏例:對沒有清理的DOM元素引用
var refA = document.getElementById('refA'); document.body.removeChild(refA); // #refA不能回收,因为存在变量refA对它的引用。 将其对#refA引用释放,但还是无法回收#refA。
3、被遺忘的計時器和回呼函數
var someResource = getData(); setInterval(function() { var node = document.getElementById('Node'); if(node) { node.innerHTML = JSON.stringify(someResource)); } }, 1000);
4、循環引用
在js的記憶體管理環境中,如果物件A 對B有存取物件的權限,就稱為物件A 引用物件B。引用的計數的策略就是看對像有沒有其他對象引用到它,如果沒有對象引用這個對象,那麼這個對象將會被回收 。var obj1 = { a: 1 }; // 一个对象(称之为 A)被创建,赋值给 obj1,A 的引用个数为 1 var obj2 = obj1; // A 的引用个数变为 2 obj1 = 0; // A 的引用个数变为 1 obj2 = 0; // A 的引用个数变为 0,此时对象 A 就可以被垃圾回收了
function func() { var obj1 = {}; var obj2 = {}; obj1.a = obj2; // obj1 引用 obj2 obj2.a = obj1; // obj2 引用 obj1 }
以上是記憶體洩漏是什麼以及如何解決的詳細內容。更多資訊請關注PHP中文網其他相關文章!