Выбрать главу

      else i++;

    } 

    if (i == len) throw TypeError();

  }

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

  while(i < len) {

    if (і in а)

      accumulator = f.call(undefined, accumulator, a[i], i, a);

    i++;

  }

  return accumulator;

};

После определения этих функций map() и reduce() вычисление среднего и стандартного отклонения будет выглядеть так:

var data = [1,1,3,5,5];

var sum = function(x.y) { return x+y; };

var square = function(x) { return x*x; };

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

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

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

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

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

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

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

function not(f) {

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

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

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

  };

}

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

  return х % 2 === 0;

};

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

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

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

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

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

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

function mapper(f) {

  return function(a) { return map(a, f); };

}

var increment = function(x) { return x+1; };

var incrementer = mapper(increment);

incrementer([1,2,3]) // => [2,3,4]

Ниже приводится пример еще одной, более универсальной функции, которая принимает две функции, f и g, и возвращает новую функцию, которая возвращает результат f(g()):