Функции высшего порядка принимают в качестве аргументов другие функции или возвращают функцию.
Примером может быть встроенный метод массива filter();
Метод filter() создаёт новый массив со всеми элементами, прошедшими проверку, задаваемую в передаваемой функции.
Создадим новый массив с четными числами:
let numbers = [1,2,3,4,5,6];
function isEven(x){
return x % 2 === 0;
}
let evenNumbers = numbers.filter(isEven);
//2 4 6
Методы map() и reduce() тоже функции высшего порядка.
Создадим сами функцию высшего порядка.
Передаем функцию в качестве параметра (в нашем случае process();). До начала работы функции process(); выведем "начало загрузки", после - "конец загрузки".
function doWithLoading(fn){
console.log("начало загрузки");
let returnValue = fn();
console.log("конец загрузки");
return returnValue;
}
function process() {
console.log("загружаем...");
}
doWithLoading(process);
// начало загрузки
// загружаем...
// конец загрузки
Замыкание - это работа функции высшего порядка, которая возвращает другую функцию.
Пример:
function createGenerator(prefix){
let index = 0;
return function generateNewID(){
index++;
return prefix + index.toString();
}
}
let generateNewID = createGenerator("вызов номер: ");
console.log(generateNewID()); //вызов номер: 1
console.log(generateNewID()); //вызов номер: 2
console.log(generateNewID()); //вызов номер: 3
Итог. В JavaScript функции могут храниться в переменной, объекте или массиве, передаваться как аргументы в другую функцию, могут быть возвращены другими функциями.