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