JavaScript. Подробное руководство, 6-е издание, стр. 102
Вызываемые объекты, не являющиеся функциями, встречаются в современных реализациях JavaScript в двух ситуациях. Во-первых, веб-броузер IE (версии 8 и ниже) реализует клиентские методы, такие как
<b>Window.alert()</b><b>Document.getElementsByld(),</b><b>Function</b><b>Function</b>Другой типичной разновидностью вызываемых объектов являются объекты
<b>RegExp</b><b>RegExp</b><b>ехес().</b><b>RegExp</b><b>typeof</b><b>RegExp</b>Если в программе потребуется определить, является ли объект настоящим объектом функции (и обладает методами функций), сделать это можно, определив значение атрибута class (раздел 6.8.2), использовав прием, продемонстрированный в примере 6.4:
<b>function isFunction(x) {</b><b>return Object.prototype.toString.call(x) === "[object Function]";</b><b>}</b>Обратите внимание, насколько эта функция
<b>isFunction()</b><b>isArray(),</b>8.8. Функциональное программирование
JavaScript не является языком функционального программирования, как
<b>Lisp</b><b>Haskell</b><b>mар()</b><b>reduce(),</b>8.8.1. Обработка массивов с помощью функций
Представим, что у нас имеется массив чисел и нам необходимо найти среднее значение и стандартное отклонение для этих значений. Эту задачу можно было бы решить без использования приемов функционального программирования, как показано ниже:
<b>var data = [1,1,3,5,5]; // Массив чисел</b><b>// Среднее - это сумма значений элементов, деленная на их количество </b><b>var total = 0;</b><b>for(var і = 0; і < data.length; і++) total += data[i]; </b><b>var mean = total/data.length; // Среднее значение равно З</b><b>// Чтобы найти стандартное отклонение, необходимо вычислить сумму квадратов </b><b>// отклонений элементов от среднего, </b><b>total = 0;</b><b>for(var і = 0; і < data.length; i++) {</b><b> var deviation = data[i] - mean; </b><b> total += deviation * deviation;</b><b>}</b><b>var stddev = Math.sqrt(total/(data.length-1)); // Стандартное отклонение = 2</b>Те же вычисления можно выполнить в более кратком функциональном стиле, задействовав методы массивов
<b>mар()</b><b>reduce(),</b><b>// Для начала необходимо определить две простые функции </b><b>var sum = function(x,у) { return х+у; }; </b><b>var square = function(x) { return x*x; };</b><b>// Затем использовать их совместно с методами класса Array для вычисления</b><b>// среднего и стандартного отклонения</b><b>var data = [1,1,3,5,5];</b><b>var mean = data.reduce(sum)/data.length;</b><b>var deviations = data.map(function(x) {return x-mean;});</b><b>var stddev = Math.sqrt(deviations.map(square).reduce(sum)/(data.length-1));</b>A как быть, если в нашем распоряжении имеется только реализация ЕСМА-Script 3, где отсутствуют эти новейшие методы массивов? Можно определить собственные функции mар() и reduce(), которые будут использовать встроенные методы при их наличии:
<b>// Вызывает функцию f для каждого элемента массива и возвращает массив результатов.</b><b>// Использует метод Array.prototype.mар, если он определен, </b><b>var mар = Array.prototype.тар</b><b> ? function(a, f) { return a.map(f); } // Если метод map() доступен </b><b> : function(a,f) { // Иначе реализовать свою версию</b>