2013-03-20 60 views
2

我有一个对象,生成的HTML元素也与对象的数组连接,让我们说我们有一个它的实例。所以当它创建元素时,它还会将以下事件侦听器分配给元素的嵌套部分(类为uploadDelete)。removeEventListener与唯一匿名函数

现在,此事件侦听器需要调用创建它的对象实例的delete方法,并在创建时指定i的值。由于事件在Window下,因此需要将实例与i值一起传递给匿名函数。

因此,这为事件分配了一个非常独特的函数,并且因为delete方法将销毁包含侦听器的元素,所以我希望先删除它;从我读过的话可能会导致泄漏,否则(?)。我也使用严格模式,所以不使用arguments.callee。

file.display.getElementsByClassName('uploadDelete')[0].addEventListener('click', 
(function(that,i){ 
    return function() { 
     that.delete(i); 
    }; 
})(this,i), false); 

我已经尝试了很多不同的东西,但是当我开始有一个功能,然后将其称为听者的内部函数内部的匿名函数,我想我应该只问就在这里。我可能会解决整体问题,改变其他代码,但如果能够回答这个问题,它仍然有帮助。


下面是我最终在Norguard的答案帮助下做的。由于独特性是从一个对象调用的文件而产生的,我刚刚创建的文件的一个新的属性来存储功能:

file.deleteFunction = (function(that,i){ 
    return function() { 
     that.delete(i); 
    }; 
})(this,i); 

file.display.getElementsByClassName('uploadDelete')[0].addEventListener('click',file.deleteFunction, false); 

删除功能被调用,然后删除该事件监听器。

回答

2

一个相对无痛的做法可能是在作用域中创建一个对象,该对象负责添加和删除侦听器,这些侦听器构建一个ID,串行或非ID,并将存储监听器在对象中的任何内容该ID将ID返回给任何请求它的对象/模块(或将匿名函数传回给它们)。

// trivial example 
var listeners = {}, 
    i = 0, 


add = function (context, func, closure) { 
    var enclosed = (function (closure) { 
     return function() { /* ... */; func(); }; 
    }(closure)), 
    index = i; 

    context.addEventListener("...", enclosed, false); 
    listeners[index] = enclosed; 
    i += 1; 
    return index; 
}; 

add现在将添加监听器,但也将存储你传递的addEventListener到listeners对象的功能。 如果您需要对i的引用,那么您已经在关闭中找到了它,如果需要的话。

所以现在当你删除的东西,你可以寻找保存在listeners[i]功能。

如果您不想在任何一个地方保存一张满满的这样的表格,不管出于何种原因,都会捕获返回语句,而不是返回i,而是返回该函数;

// inside of your module 
// I'm not usually crazy about `this`, without doing something particular with it, 
// but hopefully it illustrates my point 
this.cached_func = add(this.el, this.callback.bind(this), this.secret); 
现在

所以,当谈到时间删除一切,你要关闭你的听众......

remove(this.cached_func); 

所有这一切说的,你读过有关的泄漏是仍然有可能,但主要的罪魁祸首是IE6/7(及更早)。
随着人们远离恶意浏览器,这变得不那么重要。
事实上,鼓励IE6中的内存转储可能只是鼓励人们不使用IE6的一种好方法。

+0

这与我开始考虑的事情类似。感谢您的答复,并清除这些事情! – 2013-03-21 21:04:00