#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 /…