Если вы изучаете JavaScript, вы, вероятно, сталкивались с термином «Функции высшего порядка». Проще говоря, функции высшего порядка — это функции, которые оперируют другими функциями. Они могут принимать функции в качестве аргументов или возвращать их в качестве вывода.
Принятие в JavaScript функций высшего порядка делает его идеальным для функционального программирования. Функциональное программирование — это парадигма программирования, в которой вы можете передавать функции в качестве параметров другим функциям, а также возвращать их в виде значений. В функциональном программировании мы думаем и программируем с точки зрения функций. JavaScript, Haskell, Clojure, Scala и Erlang — это лишь некоторые из языков, реализующих функциональное программирование.
JavaScript рассматривает функции как граждан первого класса. Это потому, что функции являются объектами. Мы можем добавлять свойства к функциям так же, как мы делаем это с объектами. Например:
function greeting() { console.log('Hello World'); } // We can add properties to functions like we do with objects greeting.lang = 'English'; // Prints 'English' console.log(greeting.lang);
В JavaScript вы можете делать с функциями все, что вы можете делать с другими типами, такими как объекты, строки или числа. Вы можете передавать их в качестве параметров другим функциям (обратным вызовам), назначать их переменным и передавать их другим пользователям. Вот почему функции в JavaScript известны как функции первого класса.
Теперь, когда мы знаем, что такое функции первого класса, давайте углубимся в функции высшего порядка в JavaScript.
Некоторые примеры встроенных функций высшего порядка включают в себя Ниже перечислены некоторые из множества встроенных функций высшего порядка:
- Array.prototype.map()
- Array.prototype.filter()
- Array.prototype.reduce()
- Array.prototype.forEach()
- EventTarget.addEventListener()
Чтобы лучше понять, вот некоторые дополнительные сведения о каждом из них:
1- Array.prototype.map(): эта функция высшего порядка создает новый массив, вызывая предоставленную функцию для каждого элемента в исходном массиве. Предоставленная функция может каким-то образом преобразовывать каждый элемент. Например, если у вас есть массив чисел и вы хотите удвоить каждое число, вы можете использовать map
следующим образом:
const originalArray = [1, 2, 3]; const doubledArray = originalArray.map(num => num * 2); // doubledArray is now [2, 4, 6]
2- Array.prototype.filter():Эта функция высшего порядка создает новый массив, отфильтровывая элементы исходного массива на основе предоставленной функции. Предоставленная функция должна возвращать логическое значение, указывающее, следует ли сохранять элемент или нет. Например, если у вас есть массив чисел и вы хотите сохранить только четные числа, вы можете использовать filter
следующим образом:
const originalArray = [1, 2, 3, 4, 5, 6]; const evenArray = originalArray.filter(num => num % 2 === 0); // evenArray is now [2, 4, 6]
3- Array.prototype.reduce(): эта функция высшего порядка «сводит» массив к одному значению, вызывая предоставленную функцию для каждого элемента и накапливая результат. Предоставленная функция должна принимать два аргумента: аккумулятор и текущий элемент, а также возвращать новое значение для аккумулятора. Например, если у вас есть массив чисел и вы хотите найти сумму всех чисел, вы можете использовать reduce
следующим образом:
const originalArray = [1, 2, 3, 4, 5]; const sum = originalArray.reduce((accumulator, currentValue) => accumulator + currentValue, 0); // sum is now 15
4-Array.prototype.forEach(): эта функция более высокого порядка вызывает предоставленную функцию для каждого элемента в массиве, но не создает новый массив, как это делают map
или filter
. Предоставленная функция может выполнять некоторую операцию над каждым элементом, но ничего не возвращает. Например, если у вас есть массив имен и вы хотите вывести каждое имя в консоль, вы можете использовать forEach
следующим образом:
const names = ['Alice', 'Bob', 'Charlie']; names.forEach(name => console.log(name)); // this will log "Alice", "Bob", and "Charlie" to the console
5-EventTarget.addEventListener(): эта функция высшего порядка позволяет добавить прослушиватель событий к элементу, например к кнопке или форме ввода. Предоставленная функция вызывается всякий раз, когда в элементе происходит указанное событие, например нажатие кнопки или отправка формы. Например, если у вас есть кнопка с идентификатором «myButton» и вы хотите показывать предупреждение при нажатии на нее, вы можете использовать addEventListener
следующим образом:
const button = document.getElementById('myButton'); button.addEventListener('click', () => alert('Button clicked!')); // this will show an alert when the button is clicked
Создание нашей собственной функции высшего порядка
До этого момента мы видели различные функции высшего порядка, встроенные в язык. Теперь давайте создадим нашу собственную функцию высшего порядка. Для простоты давайте создадим функцию более высокого порядка, которая принимает массив чисел и функцию обратного вызова в качестве аргументов и возвращает новый массив, где каждый элемент является результатом применения функции обратного вызова к соответствующему элементу в исходном массиве. .
function mapArray(arr, callback) { const result = []; for (let i = 0; i < arr.length; i++) { result.push(callback(arr[i])); } return result; }
В приведенном выше коде мы определяем функцию с именем mapArray
, которая принимает два аргумента: массив (arr
) и функцию обратного вызова (callback
). Внутри функции мы создаем пустой массив с именем result
. Затем мы перебираем исходный массив arr
, используя цикл for
, и применяем функцию обратного вызова к каждому элементу, используя функцию callback
. Результат каждого вызова функции помещается в массив result
. Наконец, мы возвращаем массив result
.
Давайте посмотрим на пример того, как мы можем использовать эту функцию более высокого порядка:
const numbers = [1, 2, 3, 4, 5]; function multiplyByTwo(num) { return num * 2; } const doubledNumbers = mapArray(numbers, multiplyByTwo); console.log(doubledNumbers); // Output: [2, 4, 6, 8, 10]
В приведенном выше коде мы сначала определяем массив чисел с именем numbers
. Затем мы определяем функцию обратного вызова с именем multiplyByTwo
, которая принимает число в качестве аргумента и возвращает число, умноженное на 2. Затем мы вызываем функцию mapArray
, передавая массив numbers
и функцию multiplyByTwo
в качестве аргументов. Результат вызова этой функции сохраняется в переменной doubledNumbers
, которую мы затем записываем в консоль.
Вот и все! Мы только что создали собственную функцию высшего порядка в JavaScript. Возможности функций высшего порядка безграничны, и их освоение может сделать нас лучшими программистами.
Заключение
Таким образом, мы изучили концепцию функций высшего порядка и различные доступные встроенные функции высшего порядка. Кроме того, мы научились создавать собственные функции высшего порядка. Эти функции обладают уникальной возможностью получать и возвращать другие функции в качестве аргументов и выходных данных, что делает их мощным инструментом программирования. Если вы нашли эту статью полезной, поставьте лайк 👏, подпишитесь на меня в Medium и не стесняйтесь оставлять комментарии, если у вас есть какие-либо вопросы или проблемы. Спасибо за чтение!