Функции-коллбэки в JavaScript

Функции можно передавать параметрами в другие функции. Такие функции-параметры называются коллбэками (англ. callback). Давайте посмотрим работу с ними на примере.

Пусть мы хотим сделать функцию, которая первым параметром будет принимать массив, а вторым - коллбэк, который будет применять к каждому элементу массива:

function each(arr, callback) { // тут какой-то код }

Напишем реализацию нашей функции:

function each(arr, callback) { let result = []; for (let elem of arr) { result.push( callback(elem) ); // вызываем функцию-коллбэк } return result; }

Наша функция each - универсальная. Это значит, что мы можем передавать в нее различные коллбэки, выполняя разные операции над массивами. При этом код нашей функции останется неизменным - будут меняться только передаваемые коллбэки.

Давайте для примера с помощью нашей функции возведем в квадрат каждый элемент какого-нибудь массива. Для этого передадим параметром соответствующий коллбэк:

let result = each([1, 2, 3, 4, 5], function(num) { return num ** 2; }); console.log(result);

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

let result = each([1, 2, 3, 4, 5], function(num) { return num ** 3; }); console.log(result);

Дан массив с числами. С помощью созданной нами функции each увеличьте каждый элемент в два раза.

Дан массив со строками. С помощью созданной нами функции each переверните символы каждой строки в обратном порядке.

Дан массив со строками. С помощью созданной нами функции each сделайте заглавным первый символ каждой строки.

Нюансы

Коллбэки не обязательно должны быть анонимными функциями. Пусть для примера у нас есть следующая функция:

function square(num) { return num ** 2; }

Давайте с ее помощью возведем каждый элемент массива в квадрат:

function square(num) { return num * num; } let result = each([1, 2, 3, 4, 5], square); console.log(result);

С помощью следующей функции возведите все элементы массива в куб:

function cube(num) { return num ** 3; }