• Теория
  • Теория

Передайте функцию, пожалуйста

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

Мы уже разобрались с синтаксисом событий и объектом event, но не обсудили ещё кое-что. Возможно, запись добавления обработчика показалась вам необычной.

button.addEventListener('click', function () {
  // Инструкции
});

Мы передаём одну функцию в качестве параметра в другую функцию — в addEventListener. Такая запись может удивить, но это обычная практика — в JavaScript так делать можно. Тем более вы уже передавали функции в другие функции раньше!

var getString = function () {
  return 'Привет из функции!';
}

console.log(getString);    // Выведет код функции
console.log(getString()); // Выведет: Привет из функции!

Мы передали функцию и вызов функции в console.log. А ведь console.log() — тоже функция!

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

console.log(function () {
  return 'Привет из функции!';
});
// Выведет код функции

console.log(function () {
  return 'Привет из функции!';
}());
// Выведет: Привет из функции!

У такой функции нет своего имени, она не записана в переменную. Мы создаём её там же, где передаём в другую функцию. Такие функции, которые создаются в момент передачи и не имеют названия, называются анонимными функциями.

Обратите внимание на самую важную часть — мы передаём функцию в обработчики, а не вызываем её. Если мы вызовем обработчик, код из него сразу выполнится, и в нужный момент наши инструкции не сработают. Код выполнится только один раз в момент вызова и больше не будет повторяться. Это распространённая ошибка, но так делать неправильно.

// Так добавлять обработчик неправильно

button.addEventListener('click', function () {
  console.log('Клик по кнопке');
}());
// В консоль сразу же выведется сообщение: Клик по кнопке

Вообще JavaScript выполняет программу последовательно, команду за командой. Но к событиям это не относится. Дело в том, что события не происходят последовательно, синхронно. Мы настраиваем обработчик, но инструкции выполняются не сразу, а только тогда, когда произойдёт событие. Это может произойти и через 5 минут после открытия сайта, и через 10, а может пользователь вообще не кликнет по ссылке или кнопке. Тогда событие не случится. События асинхронны, то есть происходят не по расписанию в какое-то конкретное время, друг за другом, а тогда, когда понадобится. В этом главная сила событий.

Допишем наш код, чтобы попап появлялся на странице после клика по кнопке «Показать контакты».

Минимальный вид табов
  • index.html
HTML
HTML

Вы перешли на другую страницу

Кликните внутри мини-браузера, чтобы поставить фокус в это окно.

100%
Бабушка Кекс

Притормози, дружище

Проходить вызовы части «Знакомство с событиями» тренажёра «Погружение в браузерный JavaScript» можно после регистрации и оформления подписки.