JavaScript. Подробное руководство, 6-е издание, стр. 103

<b>  var results = [];</b>

<b>  for(var і = 0, len = a.length; і &lt; len; і++) {</b>

<b>    if (і in a) results[i] = f.call(null, a[i], і, a);</b>

<b>  }</b>

<b>  return results;</b>

<b>};</b>

<b>// Выполняет свертку массива в единственное значение, используя функцию f</b>

<b>// и необязательное начальное значение. Использует метод Array.prototype.reduce,</b>

<b>// если он определен.</b>

<b>var reduce = Array.prototype.reduce</b>

<b>  ? function(a, f, initial) { // Если метод reduce() доступен,</b>

<b>    if (arguments.length &gt; 2)</b>

<b>      return a.reduce(f, initial); // Если указано начальное значение, </b>

<b>    else return a.reduce(f); // Иначе без начального значения.</b>

<b>  }</b>

<b>  : function(a, f, initial) { // Этот алгоритм взят из спецификации ES5</b>

<b>  var і = 0, len = a.length, accumulator;</b>

<b>  // Использовать указанное начальное значение или первый элемент а </b>

<b>  if (arguments.length &gt; 2)</b>

<b>    accumulator = initial; </b>

<b>  else { // Найти первый элемент массива с определенным значением </b>

<b>    if (len == 0) throw TypeError();</b>

<b>    while(i &lt; len) {</b>

<b>      if (i in a) {</b>

<b>        accumulator = a[i++];</b>

<b>        break;</b>

<b>      }</b>

<b>      else i++;</b>

<b>    }</b>
 

<b>    if (i == len) throw TypeError();</b>

<b>  }</b>

<b>  // Теперь вызвать f для каждого оставшегося элемента массива</b>

<b>  while(i &lt; len) {</b>

<b>    if (і in а)</b>

<b>      accumulator = f.call(undefined, accumulator, a[i], i, a);</b>

<b>    i++;</b>

<b>  }</b>

<b>  return accumulator;</b>

<b>};</b>

После определения этих функций

<b>map()</b>
и
<b>reduce()</b>
вычисление среднего и стандартного отклонения будет выглядеть так:

<b>var data = [1,1,3,5,5];</b>

<b>var sum = function(x.y) { return x+y; };</b>

<b>var square = function(x) { return x*x; };</b>

<b>var mean = reduce(data, sum)/data.length;</b>

<b>var deviations = map(data, function(x) {return x-mean;});</b>

<b>var stddev = Math.sqrt(reduce(map(deviations, square), sum)/(data.length-1));</b>

8.8.2. Функции высшего порядка

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

<b>// Эта функция высшего порядка возвращает новую функцию, которая передает свои аргументы </b>

<b>// функции f и возвращает логическое отрицание значения, возвращаемого функцией f; </b>

<b>function not(f) {</b>

<b>  return function() { // Возвращает новую функцию</b>

<b>    var result = f.apply(this, arguments); // вызов f </b>

<b>    return !result; // и инверсия результата.</b>

<b>  };</b>

<b>}</b>

<b>var even = function(x) { // Функция, определяющая четность числа </b>

<b>  return х % 2 === 0;</b>

<b>};</b>

<b>var odd = not(even); // Новая функция, выполняющая противоположную операцию</b>

<b>[1,1,3,5,5].every(odd); // =&gt; true: все элементы массива нечетные</b>

Функция

<b>not()</b>
в примере выше является функцией высшего порядка, потому что она принимает функцию в виде аргумента и возвращает новую функцию. В качестве еще одного примера рассмотрим функцию
<b>mаррег(),</b>
представленную ниже. Она принимает функцию в виде аргумента и возвращает новую функцию, которая отображает один массив в другой, применяя указанную функцию. Данная функция использует функцию
<b>mар(),</b>
которая была определена выше, и важно понимать, чем отличаются эти две функции:

<b>// Возвращает функцию, которая принимает массив в виде аргумента, применяет функцию f </b>

<b>// к каждому элементу и возвращает массив возвращаемых значений.</b>

<b>// Эта функция отличается от функции тар(), представленной выше, </b>

<b>function mapper(f) {</b>