2016-04-21 121 views
0
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事件。我想,當2000毫秒後的事件偵聽器添加回(6號線和13號線),它並沒有規定它不會因爲工作什麼參數它不饒人,這就像在第一線我寫事件監聽器的傳遞參數

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

,並應觸發像

Uncaught ReferenceError: e is not defined

但實際上該代碼工作的錯誤,我不明白爲什麼當監聽器被添加回它承認e不指定e作爲放慢參數?

+0

當你參考***函數時,參數自動傳遞,總是這裏沒有什麼不可思議的東西? – adeneo

+1

@adeneo「參數自動傳遞」---這是有點誤導。調用者明確地傳遞它們,它不是「自動的」。 – zerkms

+0

@zerkms - 當然,參數總是必須由調用者傳遞以存在於被調用的函數中,所以我猜你可以說參數是在命名函數和匿名函數中自動傳遞的,假設它們實際上已被傳遞。 OP似乎有的真正問題是認爲命名「匿名」函數會產生任何影響,而忽略函數中的'e'參數總是會使'e'變得不明確,這更加明顯,無論該函數的名稱或調用方式。 – adeneo

回答

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」使用該函數,並「調用它」並傳遞它的argument = event。