Функции обычно передаются в методы массива и вызываются для элементов внутри массива. На самом деле это массив, в котором вызывается метод. Мы подробно рассмотрим эти методы массива.

Для каждого()

Метод ForEach() массива принимает функцию обратного вызова и вызывает эту функцию обратного вызова для каждого элемента в массиве. Таким образом, выполняется итерация по массиву, аналогичная использованию цикла for. Проверьте его подпись:

array.ForEach(function callback(currentValue, index, array) {
    // Function code goes in here
  })

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

Предположим, у нас есть простая функция logIfOdd(), которая принимает одно число и выводит его на консоль, если это число нечетное:

function logIfOdd(n) {
  if (n % 2 !== 0) {
    console.log(n);
  }
}
logIfOdd(2);
// (nothing is logged)
logIfOdd(3);
// 3

Если в функцию передается 2, logIfOdd() ничего не выводит на консоль, поскольку 2 — четное число. Однако, когда в функцию передается 3, 3 регистрируется в консоли, потому что это нечетное число. Функция logIfOdd() отлично работает для отдельных чисел, но давайте рассмотрим возможность проверки всего массива и регистрации только нечетных чисел в нем?

[3, 7, 4, 8, 12, 13]

Мы можем перебрать вышеуказанный массив с помощью forEach() и просто передать ему функцию logIfOdd()!

[3, 7, 4, 8, 12, 13].forEach(function logIfOdd(n) {
  if (n % 2 !== 0) {
    console.log(n);
  }
});
// 3
// 7
// 13

В приведенном выше массиве на консоль выводятся только нечетные числа. Но что произошло на самом деле: logIfOdd() — это функция, которая передается в качестве аргумента в forEach(). forEach() затем вызывает logIfOdd() для каждого элемента в массиве (т. е. [3, 7, 4, 8, 12, 13]), что выводит 3, 7 и 13. Имейте в виду, что довольно часто передается анонимная функция в качестве аргумента в forEach():

[3, 7, 4, 8, 12, 13].forEach(function (n) {
  if (n % 2 !== 0) {
    console.log(n);
  }
});
// 3
// 7
// 13

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

[3, 7, 4, 8, 12, 13].forEach(logIfOdd);
// 3
// 7
// 13

Каждый из трех показанных способов дает один и тот же вывод (т. е. запись 3, 7 и 13 в консоль).

Метод карты()

Метод map() в Array похож на forEach() тем, что он вызывает функцию обратного вызова для каждого элемента массива. Однако следует отметить, что метод map() возвращает новый массив с учетом того, что было возвращено функцией обратного вызова. см. следующее:

const names = ['kendrick', 'Thelma', 'Charlse'];
const nameLengths = names.map(function(name) {
  return name.length;
});

Мы вызываем map() для массива имен и передаем ей анонимную функцию в качестве аргумента: метод работает с массивами, поэтому нам нужно начать с массива:

const names = ['kendrick', 'Thelma', 'Charlse'];

Мы вызываем map() для массива имен и передаем ей анонимную функцию в качестве аргумента:

names.map(function(name) {
  return name.length;
});

Функция, переданная в Мы вызываем map() для массива имен и передаем ей анонимную функцию в качестве аргумента: она вызывается для каждого элемента в массиве имен! Функция получает первое имя в массиве, сохраняет его в переменной name и возвращает его длину. Затем он делает это снова для оставшихся двух имен. Помните, что ключевое различие между методами forEach() и map() заключается в том, что forEach() ничего не возвращает, но когда мы вызываем map() для массива имен и передаем ей анонимную функцию в качестве аргумента, она возвращает новую массив со значениями, возвращаемыми функцией:

const nameLengths = names.map(function(name) {
  return name.length;
});

Итак, nameLengths будет новым массивом: [8, 6, 7]. Опять же, важно понимать, что мы вызвали map() для массива имен и передали ей анонимную функцию в качестве аргумента. Метод map() возвращает новый массив; он не изменяет исходный массив. Это был всего лишь краткий обзор того, как мы вызываем map() для массива имен и передаем ей анонимную функцию в качестве аргумента. Для более глубокого погружения ознакомьтесь с методом map(): на MDN.

метод filter()

Метод filter() массива аналогичен методу map():

  • Он вызывается в массиве
  • В качестве аргумента принимает функцию
  • Он возвращает новый массив.

Несоответствие между ними заключается в том, что функция, переданная в filter(), используется в качестве теста, а в новый массив включаются только те элементы массива, которые прошли тест. Рассмотрим следующий пример:

const names = ['kendrick', 'Tesy', 'Charlse'];
const shortNames = names.filter(function(name) {
  return name.length < 5;
});

Как и в предыдущем случае, давайте немного разберемся! У нас есть начальный массив:

const names = ['kendrick', 'Tesy', 'Charlse'];

Мы вызываем filter() для массива имен и передаем ему функцию в качестве аргумента:

names.filter(function(name) {
  return name.length < 5;
});

Опять же, как и в случае с map(), функция, переданная в filter(), вызывается для каждого элемента в массиве имен. Первый элемент (т. е. «kendrick») сохраняется в переменной name. Затем выполняется тест — и это то, что делает реальную фильтрацию. Во-первых, он проверяет длину имени. Если он равен 5 или больше, то он пропускается (и не включается в новый массив!). Но если длина имени меньше 5, то name.length ‹ 5 возвращает true и имя включается в новый массив! И, наконец, как и в случае с map(), метод filter() возвращает новый массив вместо изменения исходного массива:

const shortNames = names.filter(function(name) {
  return name.length < 5;
});
console.log(shortNames);
// ['Tesy']

Выше значение shortNames — это новый массив: [‘Tesy’]. Обратите внимание, что в нем только одно имя, потому что и kendrick, и charlse состоят из 8 и 7 символов соответственно и были отфильтрованы. Это был всего лишь краткий обзор того, как работает метод filter(). Для более глубокого погружения ознакомьтесь с методом filter() на MDN.

Краткое содержание

Необходимо отметить, что функции JavaScript могут принимать множество различных аргументов. Это могут быть строки, числа, массивы и объекты. Поскольку функции являются функциями первого класса, функции также могут быть переданы в качестве аргументов данной функции. Функции, которые принимают другие функции в качестве аргументов, называются функциями высшего порядка. Когда функции передаются в качестве аргументов другим функциям, они называются функциями обратного вызова. Обратные вызовы позволяют вам передавать функции без необходимости называть их, они называются анонимными функциями, что приводит к меньшему количеству переменных. Они также позволяют вам делегировать вызывающие функции другим функциям. Методы массива, такие как forEach(), map() и filter(), используют обратные вызовы для выполнения функций над заданными элементами массива. Будьте прилежны, чтобы проверить список других методов массива из Javascript MDN.