Выразительный JavaScript.

Компонуемость.

Как бы мы могли написать предыдущий пример (поиск человека с самой ранней датой рождения) без функций высшего порядка? На самом деле, код не такой уж и ужасный:

Var min = ancestry[0];

For (var i = 1; i < ancestry.length; i++) {

Var cur = ancestry[i];

If (cur.born < min.born).

Min = cur;

}

Console.log(min);

// → {name: "Pauwels van Haverbeke", born: 1535, …}.

Чуть больше переменных, на две строчки длиннее – но пока достаточно понятный код.

Функции высшего порядка раскрывают свои возможности по-настоящему, когда вам приходится комбинировать функции. К примеру, напишем код, находящий средний возраст мужчин и женщин в наборе.

Function average(array) {

Function plus(a, b) { return a + b; }.

Return array.reduce(plus) / array.length;

}

Function age(p) { return p.died - p.born; }.

Function male(p) { return p.sex == "m"; }.

Function female(p) { return p.sex == "f"; }.

Console.log(average(ancestry.filter(male).map(age)));

// → 61.67.

Console.log(average(ancestry.filter(female).map(age)));

// → 54.56.

(Глупо, что нам приходится определять сложение как функцию plus, но операторы в JavaScript не являются значениями, поэтому их не передашь в качестве аргументов.).

Вместо того, чтобы впутывать алгоритм в большой цикл, всё распределено по концепциям, которые нас интересуют – определение пола, подсчёт возраста и усреднение чисел. Мы применяем их по очереди для получения результата.

Для написания понятного кода это прямо-таки сказочная возможность. Конечно, ясность не достаётся бесплатно.