javascript - JS 复杂的范围按摩

标签 javascript scope dom-events

对于我的应用程序中的特定监听器,我将以下代码用于范围破坏目的:

// 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/

相关文章:

java - 具有渲染属性的jsf commandlink和commandbutton不会触发actionlistener

javascript - 使用 THIS 选择当前元素的特定子元素

javascript - 如何在 JavaScript 中获取键盘输入?

javascript - 如何使用pace.js跟踪razor ajax表单

javascript - 如何根据用户选择使用多个广播来调用 Angular Controller

javascript - 变量显示在一个函数中,但没有显示在另一个 Jquery 中

javascript - 在 onerror 属性中使用闭包似乎不起作用

asp.net-mvc - ASP .NET MVC - DropDownList OnChange

javascript - 是否有办法拦截 Web 应用程序发出的 javascript 调用

javascript - 使用javascript对数组进行数字排序