1 Вопрос: Почему у метода handleEvent javascript есть доступ к событию с пропущенным параметром события?

вопрос создан в Wed, May 8, 2019 12:00 AM

Согласно документу MDN handleEvent метод имеет event в качестве отдельного параметра, однако в этом примере:

Codepen

HTML-код:

<button id="btn">Click here!</button>  

код JavaScript:

const buttonElement = document.getElementById('btn');

buttonElement.addEventListener('click', function () {
  alert(event.type);
});

Функция callback handleEvent не имеет параметров, но может получить доступ к событию (она предупреждает «щелчок»).

Как это работает?

Есть ли какая-либо ссылка, в которой явно указано, что параметр event можно опустить?

    
4
  1. 2019-05-08 15: 42: 25Z
  2. Спасибо, @melpomene, который отлично решил мой вопрос 1, но знаете ли вы ответ на вопрос 2?
    2019-05-08 15: 46: 32Z
  3. Что вы подразумеваете под вопросом 2?
    2019-05-08 15: 46: 52Z
  4. Что мы можем использовать функцию (без параметра), которая не соответствует сигнатуре функции handleEvent?
    2019-05-08 15: 48: 30Z
  5. О, JavaScript не проверяет списки параметров. Совсем. Вы можете просто игнорировать входящие аргументы или определить дополнительные параметры (они будут undefined).
    2019-05-08 15: 54: 28Z
1 ответ                              1                         

В JavaScript, когда вы ссылаетесь на переменную, она сначала просматривает локальную область, прежде чем проверять глобальную область. В вашем браузере все глобальные переменные являются свойствами объекта window. При поиске window.event получается следующая статья: https: //разработчик. mozilla.org/en-US/docs/Web/API/Window/event . В частности:

  

Событие свойства Window, доступное только для чтения, возвращает Event, который в настоящее время обрабатывается кодом сайта. Вне контекста обработчика событий это значение всегда равно undefined.

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

Следует отметить, что, как уже упоминалось в статье, на самом деле использовать это является плохой идеей. Значение не всегда соответствует ожидаемому, и использование глобальных переменных в общем случае не является предпочтительным.

Что касается вашего второго вопроса: любой параметр любой функции обратного вызова может быть опущен, если вы не планируете использовать его в своей обработке, и, если вы включите его, вы можете назвать его так, как вам нравится. В этом случае просто так происходит, что существует глобальная переменная, имя которой совпадает с именем, обычно используемым для этого параметра. Исключением является то, что вам необходимо определить все предыдущие параметры, чтобы получить доступ к более поздним.

Некоторые примеры:

// This is OK - you don't have to call the passed event "event"
buttonElement.addEventListener('click', function (ev) {
  alert(ev.type);
});

// This is not OK - the global variable is named "event" so "ev" in this case is undefined
buttonElement.addEventListener('click', function () {
  alert(ev.type);
});

// This is OK but not preferred because it uses the global "event" variable
buttonElement.addEventListener('click', function () {
  alert(event.type);
});

// This the same as the preceding example
buttonElement.addEventListener('click', function () {
  alert(window.event.type);
});
    
2
2019-05-08 15: 55: 06Z
  1. Кроме того, он не работает вообще в старых версиях Firefox и по умолчанию отключен в новых версиях.
    2019-05-08 15: 47: 38Z
  2. "отключен по умолчанию в новых версиях" Я использую 66, и он работает на моем компьютере. Как новый?
    2019-05-08 15: 48: 50Z
  3. Ох, ха Похоже, что они были полностью включены в 66: разработчик .mozilla.org /EN-US /Docs /Mozilla /Firefox /релизы /...
    2019-05-08 15: 53: 06Z
  4. Спасибо, но я не очень убежден в том, что «любой параметр любой функции может быть опущен», вы можете видеть, что необязательные параметры явно обозначаются как «необязательные» в других Документы по MDN, такие как developer.mozilla.org/en-US /документы /Web /API /EventTarget /...
    2019-05-08 15: 53: 59Z
  5. @ mzoz Думаю, я не очень хорошо это сформулировал. По сути, если вы предоставляете функцию обратного вызова, вам не нужно обрабатывать каждый переданный параметр - если вы не добавите соответствующий параметр для них, они будут просто проигнорированы. Это потому, что функция, для которой вы предоставляете обратный вызов, просто вызывает ваш обратный вызов, и когда вы вызываете функцию, вы можете передать столько аргументов, сколько захотите - дополнительные функции будут просто игнорироваться. Т.е. alert принимает только один аргумент, но вы можете указать 4 - последние 3 будут проигнорированы. alert("1","2","3","4") просто предупреждает "1".
    2019-05-08 15: 59: 24Z
источник размещен Вот