Javascript 具有匿名函数的事件侦听器

Javascript 具有匿名函数的事件侦听器,javascript,dom,asp.net-web-api,Javascript,Dom,Asp.net Web Api,上面写着 如果要将参数传递给侦听器函数,可以使用匿名函数 经过一些实验后,我发现当我尝试用这样一个单参数函数(没有匿名函数)注册事件侦听器时 侦听器函数即使在事件未发生时也会执行,但当我将其封装在匿名函数中时 target.addEventListener(type, function () {doSomething(parameter);}); 一切如期进行 为什么会发生这种行为?我猜它与闭包有某种联系。在这样定义处理函数时 target.addEventListener(type, doS

上面写着

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

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

侦听器函数即使在事件未发生时也会执行,但当我将其封装在匿名函数中时

target.addEventListener(type, function () {doSomething(parameter);});
一切如期进行


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

在这样定义处理函数时

target.addEventListener(type, doSomething(parameter));
您正在将函数的返回值作为处理程序传递。例如,考虑这个函数:

function doSomething(event) {
    return 'foo';
}
现在,函数在事件发生之前立即执行,您基本上只是将其作为处理程序传递:

target.addEventListener(type, 'foo');
那不行

第二个例子

target.addEventListener(type, function () {doSomething(parameter);});
正确地将函数作为引用传递,而不在事件发生之前执行它。

当您编写“doSomething(parameter)”时,您实际上是在调用函数,然后函数的返回值就是结果,该结果将传递给addEventListener。执行“doSomething(parameter)”时,它不是您实际想要的函数指针(尽管javascript没有可见的函数指针)

如果您编写了target.addEventListener(类型,doSomething);这实际上会像您希望的那样将函数作为参数传递。但是,它不会像您希望的那样将参数传递到该函数调用中。这就是为什么你需要像以前那样包装它。如果你想得到你想要的东西,你会:

function doSomethingWrapper() {
    doSomething(parameter);
}

target.addEventListener(type, doSomethingWrapper);

在第一种情况下,执行函数并将结果作为事件处理程序传递。在第二种情况下,匿名函数不执行,只是作为引用传递。我认为
doSomething.bind(这个参数)
也可以工作。
function doSomethingWrapper() {
    doSomething(parameter);
}

target.addEventListener(type, doSomethingWrapper);