最近我一直在閱讀關於內存泄漏的問題,但還沒有把我的腦袋全部包裹起來,並對我自己的寫作風格有一些疑問。具體而言,我不確定我處理事件的方式是否會成爲泄漏的來源。請看下面的代碼事件處理中的內存泄露
function Wrapper(text) {
this.text = text;
this.bindHandlers();
};
Wrapper.prototype.onClick = function (e) {
alert(this.text);
};
Wrapper.prototype.bindHandlers = function() {
var t = this, div = $('<div>' + this.text + '</div>');
var reallyHugeArray = [1,2,3...]; // an array of 100000 elements for example
div.click(function (e) {
// all variables of the parent function are in scope for this function, including reallyHugeArray
t.onClick(e);
});
$(document).append(div);
};
var a = new Wrapper('testString');
// had enough fun with the Wrapper, now let's nullify it
a = null;
正如你所看到的,我喜歡在onClick
函數使用匿名函數作爲事件處理程序,以便它可以更方便地訪問特定於實例變量(在這種情況下this.text
)和功能。但是,如果我理解正確,在一個函數內部有一個匿名函數(就像事件處理函數一樣),它可以訪問本地作用域,從而禁止垃圾收集器去除局部變量,從而產生泄漏。
所以我的問題是事件處理這種方法是否可以創建內存泄漏,如果是的話,有沒有什麼辦法來防止它,但仍然有方便的相若方式方法來訪問實例變量和函數?
(題外話:在函數內部函數內部功能,使的Javascript聽起來像是以來)
JS和主機對象之間的任何循環引用都可能在IE6/7中創建內存泄漏。這不會在_any體面的瀏覽器中創建泄漏_ – Raynos
您的意思是傳遞給'div.click'的函數不能被垃圾收集器刪除,對吧? – Gumbo
一個名爲'bindHandlers'的函數創建DOM節點並將它們附加到文檔中是錯誤的命名約定 – Raynos