Функции обратного вызова
1. Введение
В JavaScript функции не отличаются от чисел, строк или массивов - это просто специальный тип данных (объект), который можно хранить в переменной или передавать как аргумент в другую функцию.
Функция высшего порядка — функция, принимающая в качестве параметров другие функции или возвращающая функцию как результат.
Функция обратного вызова (callback) — это функция, которая передается другой функции в качестве аргумента и та, в свою очередь, вызывает переданную функцию.
Функции обратного вызова применяются для обработки действий пользователя на странице, при вызове функций к определенному времени, при обработке запросов на сервер и др.
2. Абстрагирование повторения
Абстракция — скрытие деталей реализации. Позволяет думать о задачах на более высоком (абстрактном) уровне.
Функции - это хороший способ построения абстракций. Допустим, скрипт выполняет какое-то действие определенное количество раз. Для этого можно написать цикл for
.
Можем ли мы абстрагировать «делать что-то N раз» как функцию? - да, напишем функцию, которая вызывает console.log()
N раз.
Но что, если мы хотим сделать что-то, кроме логирования чисел? Поскольку «делать что-то» можно представить как функцию, а функции - это просто значения, мы можем передать действие как аргумент.
Часто callback-функции анонимны и объявляются как стрелочные функции прямо во время передачи.
3. Фильтрация массива
Напишем функцию фильтрации элементов массива. Первый параметр array
- это массив, будем перебирать его используя цикл for...of
.
Второй параметр test
- это callback-функция, которую будет необходимо выполнить для каждого элемента массива.
Функция filter
создает новый массив, в который будет добавляться результат выполнения callback-функции test
над каждым элементом массива array
. Результатом работы функции будет массив отфильтрованных элементов.
Если элемент массива проходит тест, то есть callback-функция возвращает true
, он добавляться в отфильтрованный массив.
При таком подходе мы можем выполнять фильтрацию массива по критерию используя всего одну функцию для перебора, а операции над каждым элементом будут зависеть от callback-функции.
Last updated