关闭麻烦:将“event”传递给命名函数

时间:2011-07-13 16:24:17

标签: javascript closures

我正在调试一些遭受一点关闭麻烦的Javascript - 但似乎无法将“event”参数传递给函数。 这是问题(简写):

// let's say links.length == 3
for(var i = 0; i < links.length; i++){
      links[i].onclick = function(e){
          alert(i); //closure! all links alert "3"
          // do something with "e"
      }
}

这是我的解决方案

//workaround

// define function outside of loop
function outer(e,i){
     return function(){
         alert(i); //closure! all links alert "3"
        // do something with "e"
    }
}

for(var i = 0; i < links.length; i++){
      links[i].onclick = outer(e,i); //uh oh! e = undefined???
}

在我的解决方法中,我在循环外部定义了一个函数以防止关闭 - 但是我无法将“e”参数传递给它。有人能指出我正确的方向吗?

1 个答案:

答案 0 :(得分:4)

在返回的函数中定义它。

function outer(i){
       // ------------v-- event object is passed when this function is invoked
     return function( e ){
         alert(i); 
    }
}


for(var i = 0; i < links.length; i++){
      links[i].onclick = outer(i); 
}

当事件发生时,event对象被传递 ,因此需要将其定义为最终被指定为处理程序的函数的参数(您返回的函数)来自outer())。