После того как модуль окажется заперт внутри функции, ему необходим некоторый способ экспортировать общедоступный API для использования за пределами функции модуля. В примере 9.24 функция модуля возвращает конструктор, который тут же присваивается глобальной переменной. Сам факт возврата значения из функции ясно говорит о том, что оно экспортируется за пределы области видимости функции. Модули, определяющие более одного элемента API, могут возвращать объект пространства имен. Для нашего модуля с классами множеств можно было бы написать такой программный код:
// Создает единственную глобальную переменную, хранящую все модули,
// имеющие отношение к коллекциям
var collections;
if (!collections) collections = {};
// Теперь определить модуль sets
collections.sets = (function namespace() {
// Здесь находятся определения различных классов множеств,
// использующих локальные переменные и функции
// ... Большая часть программного кода опущена...
// Экспортировать API в виде возвращаемого объекта пространства имен
return {
// Экспортируемое имя свойства : имя локальной переменной
AbstractSet: AbstractSet,
NotSet: NotSet,
AbstractEnumerableSet: AbstractEnumerableSet,
SingletonSet: SingletonSet,
AbstractWritableSet: AbstractWritableSet,
ArraySet: ArraySet
};
}());
Можно предложить похожий прием, определив функцию модуля как конструктор, который будет вызываться с ключевым словом new
и экспортировать значения за счет их присваивания:
var collections;
if (!collections) collections = {};
collections.sets = (new function namespace() {
// ... Большая часть программного кода опущена ...
// Экспортировать API в объекте this
this.AbstractSet = AbstractSet;
this.NotSet = NotSet; // И так далее...
// Обратите внимание на отсутствие возвращаемого значения.
}());
Если объект глобального пространства имен уже определен, функция модуля может просто присваивать значения свойствам этого объекта и вообще ничего не возвращать:
var collections;
if (!collections) collections = {};
collections.sets = {};
(function namespace() {
// ... Большая часть программного кода опущена ...
// Экспортировать общедоступный API в объект пространства имен, созданный выше
collections.sets.AbstractSet = AbstractSet;
collections.sets.NotSet = NotSet; // И так далее...
// Инструкция return не требуется, потому что экспортирование выполняется выше.
}());
Фреймворки, реализующие инструменты загрузки модулей, могут предусматривать собственные методы экспортирования API модулей. Внутри модуля может определяться функция provides(),
которая выполняет регистрацию его API, или объект exports
, в котором модуль должен сохранять свой API. Пока в языке JavaScript отсутствуют инструменты управления модулями, вам придется использовать средства создания и экспортирования модулей, которые лучше подходят для используемой вами библиотеки инструментов.
10
Шаблоны и регулярные выражения
Регулярное выражение - это объект, описывающий символьный шаблон. Класс RegExp
в JavaScript представляет регулярные выражения, а объекты классов String
и RegExp
определяют методы, использующие регулярные выражения для выполнения поиска по шаблону и операций поиска в тексте с заменой. Грамматика регулярных выражений в языке JavaScript содержит достаточно полное подмножество синтаксиса регулярных выражений, используемого в языке Perl 5, поэтому, если вы имеете опыт работы с языком Perl, то вы без труда сможете описывать шаблоны в программах на языке JavaScript. [10] 19 В число особенностей регулярных выражений языка Perl, которые не поддерживаются в ECMAScript, входят флаги s (однострочный режим) и х (расширенный синтаксис); управляющие последовательности \а, \е, \1, \и, \L, \U, \Е, \(), \А, \Z, \z и \G; якорь (?<= позитивной ретроспективной проверки и якорь (?
)
Эта глава начинается с определения синтаксиса, посредством которого в регулярных выражениях описываются текстовые шаблоны. Затем мы перейдем к описанию тех методов классов String
и RegExp
, которые используют регулярные выражения.
Читать дальше
Конец ознакомительного отрывка
Купить книгу