// Инициализировать свойство counter объекта функции. Объявления функций
// поднимаются вверх, поэтому мы можем выполнить это присваивание до объявления функции.
uniquelnteger.counter =0;
// Эта функция возвращает разные целые числа при каждом вызове.
// Для сохранения следующего возвращаемого значения она использует собственное свойство.
function uniqueInteger() {
return uniqueInteger.counter++; // Увеличить и вернуть свойство counter
}
Еще один пример, взгляните на следующую функцию factorial(), которая использует собственные свойства (интерпретируя себя как массив) для сохранения результатов предыдущих вычислений:
// Вычисляет факториалы и сохраняет результаты в собственных свойствах.
function factorial(n) {
if (isFinite(n) && n>0 && n==Math.round(n)) { // Только конечные положительные целые
if (!(n in factorial)) // Если не сохранялось ранее
factorial[n] = n * factorial(n-1); // Вычислить и сохранить
return factorial[n]; // Вернуть сохр. результат
}
else return NaN; // Для ошибочного аргумента
}
factorial[1] = 1; // Инициализировать кэш базовым случаем.
8.5. Функции как пространства имен
В разделе 3.10.1 говорилось, что в языке JavaScript существует такое понятие, как область видимости функции: переменные, объявленные внутри функции, видимы в любой точке функции (включая и вложенные функции), но они существуют только в пределах функции. Переменные, объявленные за пределами функции, являются глобальными переменными и видимы в любой точке JavaScript-программы. В языке JavaScript отсутствует возможность объявлять переменные, доступные только внутри отдельно расположенного блока программного кода, и по этой причине иногда бывает удобно определять функции, которые играют роль временного пространства имен, где можно объявлять переменные, не засоряя глобальное пространство имен.
Предположим, например, что имеется модуль JavaScript, который можно использовать в различных JavaScript-программах (или, если говорить на языке клиентского JavaScript, в различных веб-страницах). Допустим, что в программном коде этого модуля, как в практически любом другом программном коде, объявляются переменные для хранения промежуточных результатов вычислений. Проблема состоит в том, что модуль будет использоваться множеством различных программ, и поэтому заранее неизвестно, будут ли возникать конфликты между переменными, создаваемыми модулем, и переменными, используемыми в программах, импортирующих этот модуль. Решение состоит в том, чтобы поместить программный код модуля в функцию и затем вызывать эту функцию. При таком подходе переменные модуля из глобальных превратятся в локальные переменные функции: