如何有效避免JS記憶體洩漏?MrWang66862019-04-22 18:47:18

1、意外的全域性變數

未定義的變數會在全域性物件建立一個新變數,如下:

function foo(arg) {

bar = “this is a hidden global variable”;

}

函式 foo 內部忘記使用 var ,實際上JS會把bar掛載到全域性物件上,意外建立一個全域性變數:

function foo(arg) {

window。bar = “this is an explicit global variable”;

}

另一個意外的全域性變數可能由 this 建立:

function foo() {

this。variable = “potential accidental global”;

}

// Foo 呼叫自己,this 指向了全域性物件(window)

// 而不是 undefined

foo();

解決方法

在 JavaScript 檔案頭部加上 ‘use strict’,使用嚴格模式避免意外的全域性變數,此時上例中的this指向undefined。如果必須使用全域性變數儲存大量資料時,確保用完以後把它設定為 null 或者重新定義。

2、被遺忘的計時器或回撥函式

計時器setInterval程式碼很常見:

var someResource = getData();

setInterval(function() {

var node = document。getElementById(‘Node’);

if(node) {

// 處理 node 和 someResource

node。innerHTML = JSON。stringify(someResource));

}

}, 1000);

上面的例子表明,在節點node或者資料不再需要時,定時器依舊指向這些資料。所以哪怕當node節點被移除後,interval 仍舊存活並且垃圾回收器沒辦法回收,它的依賴也沒辦法被回收,除非終止定時器。

var element = document。getElementById(‘button’);

function onClick(event) {

element。innerHTML = ‘text’;

}

element。a