В первые годы после появления язык JavaScript чаще всего использовался для создания маленьких и простых сценариев, встроенных прямо в веб_страницы. По мере становления веб_броузеров и веб_стандартов программы на языке JavaS_ cript становились все больше и все сложнее. В настоящее время многие Java_ Script_сценарии используют в своей работе внешние модули, или библиотеки программного JavaScript_кода.1
К моменту написания этих строк ведутся работы по созданию модулей много_ кратного использования, распространяемых с открытыми исходными текстами на языке JavaScript. Сеть архивов JavaScript (JavaScript Archive Network, JSAN) реализуется по образу и подобию всемирной сети архивов Perl (Compre_ hensive Perl Archive Network, CPAN), причем предполагается, что она станет для JavaScript тем же, чем стала CPAN для языка программирования и сообще_ ства Perl. Подробную информацию о JSAN и примеры программного кода мож_ но найти на сайте http://www.openjsan.org.
Язык JavaScript не предусматривает синтаксических конструкций, предназна_ ченных для создания и управления модулями, поэтому написание переносимых модулей многократного использования на языке JavaScript в значительной сте_ пени является вопросом следования некоторым основным соглашениям, описы_ ваемым в этой главе.
Наиболее важное соглашение связано с концепцией пространства имен. Основ_ ная цель этой концепции – предотвратить конфликты имен, которые могут воз_ никнуть при одновременном использовании двух модулей, объявляющих гло_
1 В базовом языке JavaScript отсутствуют какие_либо механизмы загрузки или подключения внешних модулей. Эту задачу берет на себя окружение, в которое встраивается интерпретатор JavaScript. В клиентском языке JavaScript задача решается с использованием тега <script src=> (см. главу 13). Некоторые встраива_ емые реализации предоставляют простейшую функцию load(), с помощью кото_ рой производится загрузка модулей.
10.1. Создание модулей и пространств имен
бальные свойства с одинаковыми именами: один модуль может перекрыть свой_ ства другого, что может привести к нарушениям в работе последнего.
Другое соглашение связано с порядком инициализации модуля. Это имеет важ_ ное значение для клиентского языка JavaScript, потому что в модули, которые манипулируют содержимым документа в веб_броузере, часто требуется встраи_ вать программный код, запускаемый по окончании загрузки документа.
В следующих разделах обсуждаются вопросы организации пространств имен и инициализации. В конце главы приводится расширенный пример модуля вспомогательных функций, предназначенного для работы с модулями.