Имеет ли значение количество входных параметров в функции обратного вызова?

#javascript #callback

#javascript #обратный вызов

Вопрос:

В данный момент я изучаю Java Script на курсе Udemy, и я наткнулся на кое-что, что показалось мне странным. Речь идет о «функциях обратного вызова», и реализация в курсе использует анонимные функции.

Например

 var button = document.querySelector("button"); 
button.addEventListener("click", function() { console.log("hi"); } ); 
document.addEventListener("keydown", function(event) { console.log(event); } );
  

Во второй строке функция обратного вызова является анонимной функцией без входных параметров. В третьей строке анонимная функция имеет один входной параметр: событие.

Я чувствую, что мы предполагаем, что обратный вызов может обрабатывать 0 или 1 входные параметры, но как мы можем знать наверняка? Что, если я определю анонимную функцию с 3 входными параметрами? Будет ли это иметь значение?

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

Комментарии:

1. Это не проблема в JavaScript; указание слишком малого количества параметров просто означает, что вы не сможете получить доступ ко всем аргументам из вызова функции; указание слишком большого количества просто означает, что некоторые из них не определены (кроме того, это относится ко всем функциям, а не только к функциям обратного вызова)

Ответ №1:

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

Функция, определенная с одним параметром, может быть вызвана с нулевым, одним или несколькими параметрами в javascript без каких-либо синтаксических ошибок:

 function testing (a) {
    console.log(a);
}

testing();                   // will log undefined
testing('hello');            // logs "hello"
testing('hello', 'world');   // logs "hello"
  

Это означает:

  • Функция с нулевыми параметрами может быть вызвана с любым количеством аргументов
  • Функция со многими параметрами может вызываться без аргументов

События DOM всегда будут вызывать вашу функцию с одним аргументом (за исключением более старых версий IE, которые будут вызывать их с нулевыми аргументами):

 your_callback(event);
  

Таким образом, вы можете определить свой обратный вызов с аргументом, если планируете его использовать, или опустить аргумент, если хотите его проигнорировать.

Комментарии:

1. В вашем примере кода должно быть написано testing(); testing(‘привет’); testing(«привет»,’мир’); верно? Незначительная деталь .. но в любом случае это действительно помогает. Спасибо за разъяснение. Это хорошая функция JavaScript.

2. @mauvecrow О, да. Извините за это

3. @mauvecrow Если вам интересно, как функция может получить доступ к параметрам, которых нет в ее списке аргументов, каждая функция автоматически создает переменную с именем arguments , которая является массивоподобным объектом всех переданных ей параметров. Это то, как javascript реализует varargs. Смотрите: developer.mozilla.org/en-US/docs/Web/JavaScript/Reference /…