Чтение онлайн

на главную - закладки

Жанры

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

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, в различных веб-страницах). Допустим, что в программном коде этого модуля, как в практически любом другом программном коде, объявляются переменные для хранения промежуточных результатов вычислений. Проблема состоит в том, что модуль будет использоваться множеством различных программ, и поэтому заранее неизвестно, будут ли возникать конфликты между переменными, создаваемыми модулем, и переменными, используемыми в программах, импортирующих этот модуль. Решение состоит в том, чтобы поместить программный код модуля в функцию и затем вызывать эту функцию. При таком подходе переменные модуля из глобальных превратятся в локальные переменные функции:

function mymodule {

// Здесь находится реализация модуля.

// Любые переменные, используемые модулем, превратятся в локальные

// переменные этой функции и не будут засорять глобальное пространство имен.

}

mymodule; // Но не забудьте вызвать функцию!

Данный программный код объявляет единственную глобальную переменную: имя функции «mymodule». Если даже единственное имя это слишком много, можно определить и вызвать анонимную функцию в одном выражении:

(function { // функция mymodule переписана как неименованное выражение

// Здесь находится реализация модуля.

}); // конец литерала функции и ее вызов.

Такой способ определения и вызова функции в одном выражении настолько часто используется в практике, что превратился в типичный прием. Обратите внимание на использование круглых скобок в этом примере. Открывающая скобка перед ключевым словом function является обязательной, потому что без нее ключевое слово function будет интерпретироваться как инструкция объявления функции. Скобки позволят интерпретатору распознать этот фрагмент как выражение определения функции. Это обычный способ - заключение в скобки, даже когда они не требуются, определения функции, которая должна быть вызвана сразу же после ее определения.

Практическое применение приема создания пространства имен демонстрируется в примере 8.3. Здесь определяется анонимная функция, возвращающая функцию

extend,
подобную той, что была представлена в примере 6.2. Анонимная функция проверяет наличие хорошо известной ошибки в Internet Explorer и возвращает исправленную версию функции, если это необходимо. Помимо этого, анонимная функция играет роль пространства имен, скрывающего массив с именами свойств.

Пример 8.3. Функция extend, исправленная, если это необходимо

// Определяет функцию extend, которая копирует свойства второго и последующих аргументов

// в первый аргумент. Здесь реализован обход ошибки в IE: во многих версиях IE цикл for/in

// не перечисляет перечислимые свойства объекта о, если одноименное свойство

// его прототипа является неперечислимым. Это означает, что такие свойства,

// как toString, обрабатываются некорректно, если явно не проверять их.

var extend = (function { // Присвоить значение, возвращаемое этой функцией

// Сначала проверить наличие ошибки, прежде чем исправлять ее.

for(var р in {toString:null}) {

// Если мы оказались здесь, значит, цикл for/in работает корректно

// и можно вернуть простую версию функции extend

return function extend(o) {

for(var і = 1; і < arguments.length; i++) {

var source = arguments[i];

for(var prop in source) o[prop] = source[prop];

}

return o;

Поделиться:
Популярные книги

Солнечный флот

Вайс Александр
4. Фронтир
Фантастика:
боевая фантастика
космическая фантастика
5.00
рейтинг книги
Солнечный флот

Кодекс Охотника. Книга XXXIV

Винокуров Юрий
34. Кодекс Охотника
Фантастика:
аниме
фэнтези
попаданцы
5.00
рейтинг книги
Кодекс Охотника. Книга XXXIV

Варяг

Мазин Александр Владимирович
1. Варяг
Фантастика:
альтернативная история
9.10
рейтинг книги
Варяг

Черный Маг Императора 7 (CИ)

Герда Александр
7. Черный маг императора
Фантастика:
фэнтези
попаданцы
5.00
рейтинг книги
Черный Маг Императора 7 (CИ)

Лекарь Империи 7

Карелин Сергей Витальевич
7. Лекарь Империи
Фантастика:
городское фэнтези
аниме
боевая фантастика
попаданцы
5.00
рейтинг книги
Лекарь Империи 7

Кодекс Крови. Книга ХIV

Борзых М.
14. РОС: Кодекс Крови
Фантастика:
попаданцы
аниме
фэнтези
5.00
рейтинг книги
Кодекс Крови. Книга ХIV

Справочник логопеда

Коллектив авторов
Научно-образовательная:
медицина
6.25
рейтинг книги
Справочник логопеда

Перешагнуть пропасть

Муравьёв Константин Николаевич
1. Перешагнуть пропасть
Фантастика:
боевая фантастика
космическая фантастика
8.38
рейтинг книги
Перешагнуть пропасть

Миротворец. Дипломатия Кланов

Пламенев Владимир
1. Миротворец
Фантастика:
историческое фэнтези
фэнтези
5.00
рейтинг книги
Миротворец. Дипломатия Кланов

Демон-хранитель

TsissiBlack
Фантастика:
фэнтези
мистика
5.20
рейтинг книги
Демон-хранитель

Твое сердце будет разбито. Книга 1

Джейн Анна
Любовные романы:
современные любовные романы
5.50
рейтинг книги
Твое сердце будет разбито. Книга 1

Последний Паладин. Том 11

Саваровский Роман
11. Путь Паладина
Фантастика:
попаданцы
аниме
фэнтези
5.00
рейтинг книги
Последний Паладин. Том 11

Кодекс Охотника. Книга XXI

Винокуров Юрий
21. Кодекс Охотника
Фантастика:
фэнтези
попаданцы
аниме
5.00
рейтинг книги
Кодекс Охотника. Книга XXI

Хроники Тириса. Книга 3

Маханенко Василий Михайлович
3. Хроники Тириса
Фантастика:
боевая фантастика
космическая фантастика
фантастика: прочее
5.00
рейтинг книги
Хроники Тириса. Книга 3