JavaScript. Подробное руководство, 6-е издание, стр. 94
<b>}</b><b>// Так можно вызвать эту функцию для вычисления выражения (2+3)+(4*5): </b><b>var і = operate(add, operate(add, 2, 3), operate(multiply, 4, 5));</b><b>// Ради примера реализуем эти функции снова, на этот раз</b><b>// с помощью литералов функций внутри литерала объекта,</b><b>var operators = {</b><b> add: function(x,у) { return x+y; },</b>subtract: function(x,y) { return x-y; },
multiply: function(x,y) { return x*y; },
divide: function(x,y) { return x/y; },
<b> pow: Math.pow // Можно использовать даже предопределенные функции</b><b>}</b><b>// Эта функция принимает имя оператора, отыскивает оператор в объекте,</b><b>// а затем вызывает его с указанными операндами.</b><b>// Обратите внимание на синтаксис вызова функции оператора, </b><b>function operate2(operation, operand1, operand2) {</b><b> if (typeof operators[operation] === "function")</b><b> return operators[operation](operand1. operand2); </b><b> else throw "неизвестный оператор":</b><b>}</b><b>// Вычислить значение ("hello" + " " + "world"):</b><b>var j = operate2("add", "hello", operate2("add", " ", "world")):</b><b>// Использовать предопределенную функцию Math.pow(): </b><b>var k = operate2("pow", 10, 2):</b>В качестве еще одного примера использования функций как значений рассмотрим метод
<b>Array.sort().</b><b>sort()</b><b>Array.sort()</b><b>Array.sort()</b>8.4.1. Определение собственных свойств функций
Функции в языке JavaScript являются не простыми значениями, а особой разновидностью объектов, благодаря чему функции могут иметь свойства. Когда функции требуется «статическая» переменная, значение которой должно сохраняться между ее вызовами, часто оказывается удобным использовать свойство объекта функции, позволяющее не занимать пространство имен определениями глобальных переменных. Например, предположим, что надо написать функцию, возвращающую уникальное целое число при каждом своем вызове. Функция никогда не должна возвращать одно и то же значение дважды. Чтобы обеспечить это, функция должна запоминать последнее возвращенное значение и сохранять его между ее вызовами. Эту информацию можно было бы хранить в глобальной переменной, но это было бы нежелательно, потому что данная информация используется только этой функцией. Лучше сохранять ее в свойстве объекта
<b>Function</b><b>// Инициализировать свойство counter объекта функции. Объявления функций</b><b>// поднимаются вверх, поэтому мы можем выполнить это присваивание до объявления функции.</b><b>uniquelnteger.counter =0;</b><b>// Эта функция возвращает разные целые числа при каждом вызове.</b><b>// Для сохранения следующего возвращаемого значения она использует собственное свойство.</b><b>function uniqueInteger() {</b><b> return uniqueInteger.counter++; // Увеличить и вернуть свойство counter</b><b>}</b>Еще один пример, взгляните на следующую функцию
<b>factorial()</b><b>// Вычисляет факториалы и сохраняет результаты в собственных свойствах.</b><b>function factorial(n) {</b><b> if (isFinite(n) && n>0 && n==Math.round(n)) { // Только конечные положительные целые </b><b> if (!(n in factorial)) // Если не сохранялось ранее</b><b> factorial[n] = n * factorial(n-1); // Вычислить и сохранить</b><b> return factorial[n]; // Вернуть сохр. результат</b><b> }</b><b> else return NaN; // Для ошибочного аргумента</b><b>}</b><b>factorial[1] = 1; // Инициализировать кэш базовым случаем.</b>8.5. Функции как пространства имен
В разделе 3.10.1 говорилось, что в языке JavaScript существует такое понятие, как область видимости функции: переменные, объявленные внутри функции, видимы в любой точке функции (включая и вложенные функции), но они существуют только в пределах функции. Переменные, объявленные за пределами функции, являются глобальными переменными и видимы в любой точке JavaScript-программы. В языке JavaScript отсутствует возможность объявлять переменные, доступные только внутри отдельно расположенного блока программного кода, и по этой причине иногда бывает удобно определять функции, которые играют роль временного пространства имен, где можно объявлять переменные, не засоряя глобальное пространство имен.