传递事件侦听器的参数

时间:2016-04-21 00:39:43

标签: javascript function parameter-passing addeventlistener

  window.addEventListener('keydown',function keydown_f(e){
    if(e.code === 'ArrowDown') {
      window.removeEventListener('keydown',keydown_f);
      // do something
      setTimeout(2000,function(){
        window.addEventListener('keydown',keydown_f);
      });
    }
    else if (e.code === 'ArrowUp') {
      window.removeEventListener('keydown',keydown_f);
      // do something
      setTimeout(2000,function(){
        window.addEventListener('keydown',keydown_f);
      });
    }
  });

我使用上面的代码每2秒捕获一次keydown事件。我认为它不会起作用,因为当2000ms之后事件监听器被添加回来(第6行和第13行)时,它没有指定它获得的参数,就像在第一行我写的那样

  window.addEventListener('keydown',function keydown_f(){  //without "e"

这应该会触发像

这样的错误
  

未捕获的ReferenceError:未定义e

但实际上代码是有效的,我不明白为什么当添加回侦听器时它识别e而不指定e作为参数?

1 个答案:

答案 0 :(得分:1)

因为是你设置"函数keydown_f"的上下文,所以可以访问:

   if(e.code === 'ArrowDown') {
  window.removeEventListener('keydown',keydown_f);
  // do something
  setTimeout(2000,function(){
    window.addEventListener('keydown',keydown_f);
  });
}
else if (e.code === 'ArrowUp') {
  window.removeEventListener('keydown',keydown_f);
  // do something
  setTimeout(2000,function(){
    window.addEventListener('keydown',keydown_f);
  });
}

这是在范围内。

功能本身" keydown_f"需要一个参数---" e"。所以,当你调用它时,让我们说:window.addEventListener(' keydown',keydown_f);

"事件"过去了。

基本上," addEventListener"抓住这个:" keydown_f",然后这样做:" keydown_f(事件)"

想到" keydown_f"作为回调,这是一个回调。 "的addEventListener"使用该功能,"称之为"并传递其参数=事件。