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
作为参数?
答案 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"使用该功能,"称之为"并传递其参数=事件。