具有匿名功能的事件监听器

Ant*_*eev 3 javascript dom asp.net-web-api

它写在MDN

如果要将参数传递给侦听器函数,则可以使用匿名函数。

经过一些实验,我发现了当我尝试使用这样的单参数函数(没有匿名函数)注册事件侦听器时

target.addEventListener(type, doSomething(parameter));
Run Code Online (Sandbox Code Playgroud)

即使没有发生事件,侦听器函数也会执行,但是当我将其包装到匿名函数中时

target.addEventListener(type, function () {doSomething(parameter);});
Run Code Online (Sandbox Code Playgroud)

一切都按预期进行。

为什么会发生这种行为?我猜想它与闭包有某种联系。

chr*_*con 5

像这样定义处理程序函数时

target.addEventListener(type, doSomething(parameter));
Run Code Online (Sandbox Code Playgroud)

您正在传递函数的返回值作为处理程序。例如,考虑以下功能:

function doSomething(event) {
    return 'foo';
}
Run Code Online (Sandbox Code Playgroud)

现在,该函数在事件发生之前立即执行,您基本上只是将其作为处理程序传递:

target.addEventListener(type, 'foo');
Run Code Online (Sandbox Code Playgroud)

那行不通。

第二个例子

target.addEventListener(type, function () {doSomething(parameter);});
Run Code Online (Sandbox Code Playgroud)

正确传递一个函数作为参考,而不必在事件发生之前执行它。

  • 我认为`doSomething.bind(this,parameter)`也将起作用。 (2认同)