对于我的应用程序中的特定监听器,我将以下代码用于范围破坏目的:
// this is all in a prototype of MyClass
var self = this;
myElement.addEventListener("stuff", function(e){self.doStuff(e)});
这将使 doStuff
具有所需的 this
绑定(bind)。
当我尝试removeEventListener
时出现问题。我想这是因为 native 函数签名必须不同?
// in a different prototype of MyClass
var self = this;
myElement.removeEventListener("stuff", function(e){self.doStuff(e)}); // doesn't work
如果我创建一个包含所有范围破坏代码的单独函数,那么该代码中的 this
绑定(bind)将指向不需要的 myElement
对象。所以问题是:如何强制监听器作用域并仍然能够删除添加的事件监听器?
*请注意,由于项目的性质,禁止以任何方式使用global
/static
变量(否则这会很简单!)
最佳答案
这与范围或您存储对 this
的引用的方式无关。问题是 removeEventListener
需要一个对之前注册为监听器的函数的引用,但是你给它一个以前从未见过的全新函数。
你需要做这样的事情:
var self = this;
var listener = function(e){self.doStuff(e)}
myElement.addEventListener("stuff", listener);
// later
myElement.removeEventListener("stuff", listener);
两个函数的主体是否相同并不重要;它们仍然是不同的功能。
参见:
关于javascript - JS 复杂的范围按摩,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8763163/