Почему аргумент события необязателен в анонимных функциях в Javascript? - PullRequest
2 голосов
/ 06 января 2020

Я просто пытаюсь понять логику c, стоящую за этим кодом:

window.onkeydown = function () {
    handler(event);
};
function handler(event)
{
    console.log(event.key); // this works!
}

Не должен ли обработчик события объявляться с аргументом события, включенным в анонимную функцию? Вот так:

window.onkeydown = function (event) {
    handler(event);
};

Я понимаю, что браузеры автоматически передают событие обработчику, но все же я нахожу странным, что назначение анонимной функции без аргументов все еще работает. Это нормальное поведение?

1 Ответ

2 голосов
/ 06 января 2020

Почему аргумент события является необязательным в анонимных функциях в Javascript?

Они не являются кросс-браузерными. У Microsoft было global event, которое было установлено на текущее событие перед вызовом обработчиков с использованием их attachEventonxyz) обработчиков. Стандарт DOM пошел другим путем: передав event в качестве аргумента.

Chrome и некоторые другие браузеры делают то и другое, так что Microsoft * специфицированный код c работает на них. Но не все браузеры делают. Например, Firefox нет, если только вы не установили специальное предпочтение в пользовательских настройках ( детали ).

Вывод ключа: используйте современную обработку событий (addEventListener, et c.), который поддерживается во всех браузерах, кроме IE8 и более ранних, и объявляет параметр event для функции:

window.addEventListener("keydown", handler);

// ...

function handler(event) {
    // ...
}

или (имя функции необязательно, но полезно в стек вызовов ошибок):

window.addEventListener("keydown", function handler(event) {
    // ...
});
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...