Функция Javascript addEventListener

Я новичок в обработчиках событий, и я столкнулся с кодом, который написан ниже.

document.addEventListener("DOMContentLoaded", function() {
    initialiseMediaPlayer();
}, false);

Есть ли разница в написании того же кода, что и

document.addEventListener("DOMContentLoaded", initialiseMediaPlayer();, false);

В конечном счете, мы вызываем одну и ту же функцию, так что это имеет значение или есть какое-то преимущество в том, чтобы написать ее вышеописанным способом?


person Bazinga777    schedule 06.03.2013    source источник
comment
Последний не будет делать то, что вы думаете   -  person John Dvorak    schedule 06.03.2013
comment
Последнее является синтаксической ошибкой   -  person John Dvorak    schedule 06.03.2013
comment
Вы передаете возвращаемое значение initialiseMediaPlayer прослушивателю событий. Убери вызов() и они будут такими же   -  person danronmoon    schedule 06.03.2013
comment
@danronmoon до возвращаемого значения   -  person John Dvorak    schedule 06.03.2013


Ответы (4)


document.addEventListener("DOMContentLoaded", function() {
    initialiseMediaPlayer();
}, false);

Выполнит initialiseMediaPlayer при загрузке содержимого dom.

document.addEventListener("DOMContentLoaded", initialiseMediaPlayer();, false);

синтаксическая ошибка; если убрать точку с запятой:

document.addEventListener("DOMContentLoaded", initialiseMediaPlayer(), false);

немедленно вызывает initialiseMediaPlayer, затем передает возвращаемое значение (которое, скорее всего, не является функцией) в addEventListener. Это не будет действовать так, как хотелось бы.


Ты можешь сделать

    document.addEventListener("DOMContentLoaded", initialiseMediaPlayer, false);

(убрать скобки = вызов функции). Затем initialiseMediaPlayer будет выполняться для загруженного содержимого dom и действовать по желанию.

Однако, в отличие от предыдущего случая, initialiseMediaPlayer фактически получит аргументы, заданные браузером. Кроме того, его возвращаемое значение принимается браузером. В случае с DOMContentLoaded, скорее всего, это не имеет большого значения.

Вы также избегаете создания одной дополнительной анонимной функции, если передаете initialiseMediaPlayer напрямую. Опять же, эффект не очень заметен с точки зрения пользователя.

person John Dvorak    schedule 06.03.2013
comment
Что делать, если initialiseMediaPlayer получает параметры? - person Fernando Montoya; 01.06.2015
comment
@montogeek этот параметр будет объектом события, наиболее заметным свойством которого является документ он указывает на. Могу поспорить, что инициализатор даже не заметит, что ему передается объект события. - person John Dvorak; 01.06.2015
comment
Спасибо, я понял это, используя .bind решить мою проблему. - person Fernando Montoya; 02.06.2015

1). Да большая разница. Вторая версия выдаст ошибку. Но даже если исправить так:

document.addEventListener("DOMContentLoaded", initialiseMediaPlayer(), false);

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

2). Еще одним существенным отличием является контекст вызова.

document.addEventListener("DOMContentLoaded", initialiseMediaPlayer, false);

initialiseMediaPlayer будет вызываться в контексте объекта document. При этом первая версия будет вызываться в Window контексте объекта.

person dfsq    schedule 06.03.2013
comment
звучит немного запутанно, но все становится намного яснее... большое спасибо - person Bazinga777; 06.03.2013
comment
Контекст означает, что this будет ссылаться на разные объекты внутри вашей функции. - person dfsq; 06.03.2013

Второй аргумент функции addEventListener() принимает функцию типа. Таким образом, вы не можете передать initialiseMediaPlayer();, потому что это вызов функции.

Что вы можете сделать, это:

var onDOMContentLoaded = function() {
    initialiseMediaPlayer();
};
document.addEventListener("DOMContentLoaded", onDOMContentLoaded, false);
person Amy    schedule 06.03.2013
comment
Спасибо, я думал, что это одно и то же. - person Bazinga777; 06.03.2013

в первом случае

document.addEventListener("DOMContentLoaded", function() {
    initialiseMediaPlayer();
}, false);

анонимная функция function(){initialiseMediaPlayer();} зарегистрирована для запуска, когда событие документа «DOMContentLoaded» запускается

во втором случае:

document.addEventListener("DOMContentLoaded", initialiseMediaPlayer();, false);

то, что зарегистрировано как прослушиватель событий, является результатом выражения initialiseMediaPlayer()

так что да, разница есть :)

person Francisco Meza    schedule 06.03.2013