removeEventListener on anonymous functions in JavaScript

我有一个对象,里面有方法。这些方法被放入匿名函数内的对象中。它看起来像这样:

var t = {};
window.document.addEventListener("keydown", function(e) {
    t.scroll = function(x, y) {
        window.scrollBy(x, y);
    };
    t.scrollTo = function(x, y) {
        window.scrollTo(x, y);
    };
});  

(还有更多的代码,但这足以显示问题)

现在,在某些情况下,我想停止事件侦听器。因此,我正在尝试做一个删除EventListener,但我不知道如何做到这一点。我已经在其他问题中读到,不可能在匿名函数上调用removeEventListener,但在这种情况下也是如此吗?

我在匿名函数内部创建了一个t方法,因此我认为这是可能的。看起来像这样:

t.disable = function() {
    window.document.removeEventListener("keydown", this, false);
}

为什么我不能这样做?

有没有其他(好的)方法来做到这一点?

奖金信息;这只需要在Safari中工作,因此缺少IE支持。


答案 1

如果您位于实际函数内部,则可以使用 arguments.callee 作为对函数的引用。如:

button.addEventListener('click', function() {
      ///this will execute only once
      alert('only once!');
      this.removeEventListener('click', arguments.callee);
});

编辑:如果您在严格模式下工作("use strict";)


答案 2

我相信这是一个匿名函数的重点,它缺乏一个名称或引用它的方法。

如果我是你,我会创建一个命名函数,或者把它放在一个变量中,这样你就有了对它的引用。

var t = {};
var handler = function(e) {
    t.scroll = function(x, y) {
        window.scrollBy(x, y);
    };
    t.scrollTo = function(x, y) {
        window.scrollTo(x, y);
    };
};
window.document.addEventListener("keydown", handler);

然后,您可以通过以下方式将其删除

window.document.removeEventListener("keydown", handler);