2016-04-21 6 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 секунды. Я думал, что это не будет работать, потому что, когда 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' от функции, всегда будет« неопределенным », что еще более очевидно, независимо от того, что называется функцией, или как она называется. – 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» использует эту функцию и «вызывает ее» и передает ее аргумент = событие.