Нередко мы представляем себе модуль как набор функций (или классов). Но как видно из предыдущих примеров, модули – это несколько больше, чем простое объявление функций, которые будут использоваться позже. Они включают в се_ бя программный код, который вызывается при первой загрузке и выполняет опе_ рации по инициализации и наполнению пространства имен. Модуль может со_ держать любой объем такого программного кода однократного запуска, и вполне допустимо создавать модули, не объявляющие никаких функций или классов, а просто запускающие некоторый программный код. Единственное правило, ко_ торого следует при этом придерживаться, – модуль не должен загромождать гло_ бальное пространство имен. Лучший способ добиться этого – поместить весь про_
204 Глава 10. Модули и пространства имен
граммный код в одну анонимную функцию, которая должна быть вызвана сразу же после того, как будет определена:
(function() { // Определить анонимную функцию. Отсутствие имени
// означает отсутствие глобального символа
// Тело функции находится здесь
// Здесь можно без опаски объявлять любые переменные,
// поскольку это не приведет к созданию глобальных символов.
})( ); // Конец определения функции и ее вызов.
Некоторые модули могут запускать свой программный код сразу же после за_ грузки. Другие требуют вызова функции инициализации позднее. Для клиент_ ского языка JavaScript существует ставшее обычным требование: модули обыч_ но предназначены для работы с HTML_документом и потому должны инициали_ зироваться после того, как документ полностью загружен веб_броузером.
Модуль может занимать пассивную позицию по отношению к процедуре инициа_ лизации, просто определяя и документируя функцию инициализации и предла_ гая пользователю вызвать эту функцию в нужное время. Это достаточно безопас_ ный и консервативный подход, но он требует, чтобы HTML_документ содержал достаточный объем программного JavaScript_кода, чтобы инициализировать по крайней мере те модули, с которыми он будет взаимодействовать.
Существует парадигма программирования (называемая ненавязчивым Java' Script'кодом и описываемая в разделе 13.1.5), в соответствии с которой модулидолжны быть полностью самодостаточными, а HTML_документы вообще не должны содержать JavaScript_код. Для создания таких «ненавязчивых» моду_ лей необходимо средство, посредством которого модули смогут самостоятельно регистрировать свои функции инициализации, чтобы те автоматически вызыва_ лись в подходящие моменты времени.
Пример 10.5 в конце этой главы включает в себя решение, позволяющее модулю самостоятельно зарегистрировать свою функцию инициализации. Внутри бро_ узера все зарегистрированные функции инициализации будут автоматически вызваны в ответ на событие «onload», генерируемое броузером. (Подробнее о со_ бытиях и обработчиках событий рассказывается в главе 17.)