JavaScript. Подробное руководство, 6-е издание, стр. 93
<b> if (element == null) continue; // Пропустить null и undefined</b><b> if (isFinite(element))</b><b> total += element;</b><b> else throw new Error("sum(): все элементы должны быть числами");</b><b> }</b><b> return total;</b><b> }</b><b> else throw new Error("sum(): аргумент должен быть массивом");</b><b>}</b>Этот метод
<b>sum()</b><b>null</b><b>undefined</b>JavaScript - чрезвычайно гибкий и к тому же слабо типизированный язык, благодаря чему можно писать функции, которые достаточно терпимо относятся к количеству и типам входных аргументов. Далее приводится метод
<b>flexsum(),</b><b>function flexisum(a) { var total = 0;</b><b> for(var і = 0; і < arguments.length; i++) {</b><b> var element = arguments[i], n;</b><b> if (element == null) continue; // Игнорировать null и undefined</b><b> if (isArray(element)) // Если аргумент - массив</b><b> n = flexisum.apply(this. element); // вычислить сумму рекурсивно</b><b> else</b><b> if (typeof element === "function") // Иначе, если это функция...</b><b> n = Number(element()); // вызвать и преобразовать,</b><b> else</b><b> n = Number(element); // Иначе попробовать преобразовать</b><b> if (isNaN(n)) // Если не удалось преобразовать в число, возбудить искл.</b><b> throw Error("flexisum(): невозможно преобразовать " + element + в число");</b><b> total += n; // Иначе прибавить n к total</b><b> }</b><b> return total;</b><b>}</b>8.4. Функции как данные
Самые важные особенности функций заключаются в том, что они могут определяться и вызываться. Определение и вызов функции - это синтаксические средства JavaScript и большинства других языков программирования. Однако в JavaScript функции - это не только синтаксические конструкции, но и данные, а это означает, что они могут присваиваться переменным, храниться в свойствах объектов или элементах массивов, передаваться как аргументы функциями и т. д. [13]
Чтобы понять, как функции в JavaScript могут быть одновременно синтаксическими конструкциями и данными, рассмотрим следующее определение функции:
<b>function square(x) { return х*х; }</b>Это определение создает новый объект функции и присваивает его переменной square. Имя функции действительно нематериально - это просто имя переменной, которая ссылается на объект функции. Функция может быть присвоена другой переменной, и при этом работать так же, как и раньше:
<b>var s = square; // Теперь s ссылается на ту же функцию, что и square </b><b>square(4); // => 16</b><b>s(4); // => 16</b>Функции могут быть также присвоены не только глобальным переменным, но и свойствам объектов. В этом случае их называют методами:
<b>var о = {square: function(x) { return х*х; }}; // Литерал объекта </b><b>var у = о.square(16); // у = 256</b>Функции могут быть даже безымянными, например, в случае присваивания их элементам массива:
<b>var а = [function(x) { return х*х; }, 20]; // Литерал объекта</b><b>а[0](а[1]); // => 400</b>Синтаксис вызова функции в последнем примере выглядит необычно, однако это вполне допустимый вариант применения выражения вызова!
В примере 8.2 демонстрируется, что можно делать, когда функции выступают в качестве данных. Хотя пример может показаться вам несколько сложным, комментарии объясняют, что происходит.
Пример 8.2. Использование функций как данных
<b>// Определения нескольких простых функций </b><b>function add(x.y) { return х + у; } </b><b>function subtract(x,у) { return х - у; } </b><b>function multiply(x,у) { return х * у; } </b><b>function divide(x,y) { return x / у; }</b><b>// Эта функция принимает одну из предыдущих функций </b><b>// в качестве аргумента и вызывает ее с двумя операндами </b><b>function operate(operator, operand1, operand2) {</b><b> return operator(operand1, operand2);</b>