<b> var results = [];</b>
<b> for(var і = 0, len = a.length; і < 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 > 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 > 2)</b>
<b> accumulator = initial; </b>
<b> else { // Найти первый элемент массива с определенным значением </b>
<b> if (len == 0) throw TypeError();</b>
<b> while(i < 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 < 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); // => true: все элементы массива нечетные</b>
Функция
<b>not()</b>
в примере выше является функцией высшего порядка, потому что она принимает функцию в виде аргумента и возвращает новую функцию. В качестве еще одного примера рассмотрим функцию
<b>mаррег(),</b>
представленную ниже. Она принимает функцию в виде аргумента и возвращает новую функцию, которая отображает один массив в другой, применяя указанную функцию. Данная функция использует функцию
<b>mар(),</b>
которая была определена выше, и важно понимать, чем отличаются эти две функции:
<b>// Возвращает функцию, которая принимает массив в виде аргумента, применяет функцию f </b>
<b>// к каждому элементу и возвращает массив возвращаемых значений.</b>
<b>// Эта функция отличается от функции тар(), представленной выше, </b>
<b>function mapper(f) {</b>