最近我一直在阅读关于内存泄漏的文章,但我还没有完全理解其中的所有内容,对于我自己的编程风格也有一些疑问。具体来说,我不确定我处理事件的方式是否可能导致内存泄漏。请考虑以下代码:
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听起来像梦境)
div.click
的函数不能被垃圾回收器删除,对吗? - GumbobindHandlers
的函数,它创建 DOM 节点并将它们附加到文档中,这是不好的命名惯例。 - Raynos