Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/ms-access/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript 在addEventListener中使用带闭包的自执行函数作为侦听器_Javascript_Closures - Fatal编程技术网

Javascript 在addEventListener中使用带闭包的自执行函数作为侦听器

Javascript 在addEventListener中使用带闭包的自执行函数作为侦听器,javascript,closures,Javascript,Closures,我使用以下代码在DOM元素上添加事件侦听器: var me = this; element.addEventListener('click', function(element) { return function(evt) { me.handler(evt, element); }; } (element) , false); 当我单击元素时,将调用处理程序,并将事件和元素作为参数 我已经通读了有关闭包的信息,但我仍然不清楚事件对象如何与evt变量关联。

我使用以下代码在DOM元素上添加事件侦听器:

var me = this;

element.addEventListener('click', function(element) {
    return function(evt) { 
        me.handler(evt, element); 
    };
} (element) , false);
当我单击元素时,将调用处理程序,并将事件和元素作为参数

我已经通读了有关闭包的信息,但我仍然不清楚事件对象如何与evt变量关联。

为什么不使用

var me = this;
element.addEventListener('click', function(evt) { 
     me.handler(evt, element); 
} , false);
我仍然不清楚事件对象如何与evt关联 变数

如果使用
addEventListener
,则在触发事件时,事件侦听器将接收一个作为事件的参数

然后,当您添加事件侦听器时,下面的代码

function(element) {
    return function(evt) { 
        me.handler(evt, element); 
    };
} (element)
计算并返回以下函数

function(evt) { 
    me.handler(evt, element); 
}

这是事件处理程序。然后,它的第一个参数
evt
是事件。

可能
元素
不是一个常量变量,例如在循环中。@Bergi那么,与其每次迭代都添加一个事件处理程序,不如添加一个执行循环的事件处理程序。感谢您的解释。我最终使用了
this.handler.bind(this,element)
代码很有可能简化为
element.addEventListener('click',this.handler,false)
evt
将作为唯一的参数自然地传递给处理程序。在处理程序内部,
将引用已单击的元素,因此无需传递它。关于问题中的代码,您在“闭包”文献中找不到任何解释
evt
。只有
元素
被困在闭包中
evt
是返回函数的唯一参数,它将成为click处理程序,就像您直接附加了内部函数,而没有外部(闭包形成)函数一样。