2016-02-19 7 views
1

Это написано на MDN чтоEvent Listener с анонимной функцией

Если вы хотите передать параметры функции прослушивания, вы можете использовать анонимную функцию.

После нескольких экспериментов я понял, когда я пытаюсь зарегистрировать приемник событий с функцией одного параметра, как это (без анонимной функции)

target.addEventListener(type, doSomething(parameter)); 

функция слушателя выполняет даже тогда, когда событие Бесполезного не случается, но когда я завершаю его анонимной функцией

target.addEventListener(type, function() {doSomething(parameter);}); 

все идет так, как ожидалось.

Почему такое поведение имеет место? Наверное, это связано с закрытием.

+1

В первом случае вы выполняете функцию и передаете результат в качестве обработчика события. Во втором случае анонимная функция не выполняется, а просто передается как ссылка. – Sirko

ответ

1

При определении функции обработчика как так

target.addEventListener(type, doSomething(parameter)); 

Вы передаете возвращаемое значение функции в качестве обработчика. Для примера рассмотрим эту функцию:

function doSomething(event) { 
    return 'foo'; 
} 

Теперь функция запускается на выполнение немедленно, до того, как событие произошло, и вы в основном только проходящее это как обработчик:

target.addEventListener(type, 'foo'); 

Это не может работать.

Второй пример

target.addEventListener(type, function() {doSomething(parameter);}); 

правильно передает функцию в качестве ссылки, без его выполняется до наступления события.

+1

Я думаю, что 'doSomething.bind (этот параметр)' также будет работать. – Andy

+0

Это тоже будет работать @Andy – baao