如果附加函数是闭包,如何删除事件侦听器?

tga*_*tga 5 javascript closures

例子:

\n\n
for (var i = 0 ; i < a.length ; i ++) {\n    a[i].addEventListener("touchend", f(i));\n}\n\nfunction f(param) {\n    return function() {\n        for (var i = 0 ; i < a.length ; i ++) {\n            a[i].removeEventListener("touchend", f(i));\n        }\n    }\n}\n
Run Code Online (Sandbox Code Playgroud)\n\n

它就是不起作用\xef\xbc\x8c我该怎么办?

\n

jfr*_*d00 2

为了调用.removeEventListener()您必须保留对该函数的引用。这意味着您必须为该函数提供一个标识符,然后您可以在 和 中使用该.addEventListener()标识符.removeEventListener()。该符号可以是本地符号(不必是全局符号),但您需要一个符号才能在两个地方使用它。

如果您可以更多地解释一下您要使用所显示的代码完成的任务以及您想要使用的位置.removeEventListener(),我们可能可以提供有关如何更改它的更具体的建议(我不遵循您的建议)正在尝试用它来做)。

也许是这样的:

var temp;
for (var i = 0 ; i < a.length ; i ++) {
    temp = f(i);
    a[i].touchEndHandler = temp;
    a[i].addEventListener("touchend", temp);
}
Run Code Online (Sandbox Code Playgroud)

然后,稍后,你可以这样做:

x.removeEventListener("touchend", x.touchEndHandler);
Run Code Online (Sandbox Code Playgroud)

或者,根据您的.removeEventListener()代码所在的位置,您也许可以将函数引用保存在闭包变量中。