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

<b>  return function(a) { return map(a, f); };</b>

<b>}</b>

<b>var increment = function(x) { return x+1; }; </b>

<b>var incrementer = mapper(increment); </b>

<b>incrementer([1,2,3]) // =&gt; [2,3,4]</b>

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

<b>// Возвращает новую функцию, которая вычисляет f(g(...)). Возвращаемая функция h </b>

<b>// передает все свои аргументы функции g, затем передает значение, полученное от g,</b>

<b>// функции f и возвращает результат вызова f. Обе функции, f и g,</b>

<b>// вызываются с тем же значением this, что и h. </b>

<b>function compose(f,g) {</b>

<b>  return function() {</b>

<b>    // Для вызова f используется call, потому что ей передается </b>

<b>    // единственное значение, а для вызова g используется apply,</b>

<b>    // потому что ей передается массив значений, </b>

<b>    return f.call(this, g.apply(this, arguments));</b>

<b>  };</b>

<b>}</b>

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

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

<b>var squareofsum = compose(square, sum); </b>

<b>squareofsum(2,3) // =&gt; 25</b>

Функции

<b>partial()</b>
и
<b>memoize(),</b>
которые определяются в следующем разделе, представляют собой еще две важные функции высшего порядка.

8.8.3. Частичное применение функций

Метод

<b>bind()</b>
функции f (раздел 8.7.4) возвращает новую функцию, которая вызывает f в указанном контексте и с заданным набором аргументов. Можно сказать, что он связывает функцию с объектом контекста и частично применяет аргументы. Метод
<b>bind()</b>
применяет аргументы слева, т.е. аргументы, которые передаются методу
<b>bind(),</b>
помещаются в начало списка аргументов, передаваемых оригинальной функции. Однако есть возможность частичного применения аргументов справа:

<b>// Вспомогательная функция преобразования объекта (или его части),</b>

<b>// подобного массиву, в настоящий массив. Используется ниже </b>

<b>// для преобразования объекта arguments в настоящий массив, </b>

<b>function array(a, n) { return Array.prototype.slice.call(a, n || 0); }</b>

<b>// Аргументы этой функции помещаются в начало списка </b>

<b>function partialLeft(f /*, ...*/) {</b>

<b>  var args = arguments; // Сохранить внешний массив аргументов</b>

<b>  return function() { // И вернуть эту функцию</b>

<b>    var а = array(args, 1); // Начиная с элемента 1 во внеш. масс,</b>

<b>    а = a.concat(array(arguments)); // Добавить внутренний массив аргум. </b>

<b>    return f.apply(this, а); // Вызвать f с этим списком аргументов</b>

<b>  };</b>

<b>}</b>

<b>// Аргументы этой функции помещаются в конец списка </b>

<b>function partialRight(f /*, ...*/) {</b>

<b>  var args = arguments; // Сохранить внешний массив аргументов</b>

<b>  return function() { // И вернуть эту функцию</b>

<b>    var а = array(arguments); // Начинать с внутр. масс, аргументов</b>

<b>    а = a.concat(array(args,1)); // Добавить внешние арг., начиная с 1.</b>

<b>    return f.apply(this, а); // Вызвать f с этим списком аргументов</b>

<b>  };</b>

<b>}</b>

<b>// Аргументы этой функции играют роль шаблона. Неопределенные значения </b>

<b>// в списке аргументов заполняются значениями из внутреннего набора, </b>

<b>function partial(f /*, ... */) {</b>

<b>  var args = arguments; // Сохранить внешний массив аргументов</b>

<b>  return function() {</b>

<b>    var a = array(args, 1); // Начинать с внешнего массива аргументов</b>

<b>    var i=0, j=0;</b>

<b>    // Цикл по этим аргументам, заменить значения undefined значениями</b>

<b>    // из внутреннего списка аргументов</b>

<b>    for(; і &lt; a.length; i++)</b>

<b>      if (a[i] === undefined) a[i] = arguments[j++];</b>

<b>    // Добавить оставшиеся внутренние аргументы в конец списка </b>

<b>    а = a.concat(array(arguments, j)) </b>

<b>    return f.apply(this, a);</b>

<b>  };</b>

<b>}</b>