Не все символы, объявляемые в модуле, предназначены для применения за его пределами. Модули могут иметь свои внутренние функции и переменные, не предназначенные для непосредственного использования в сценарии, который работает с данным модулем. В JavaScript отсутствует возможность определять, какие символы пространства имен будут общедоступными, а какие нет. Здесь опять же приходится довольствоваться соглашениями, предотвращающими не_ корректное использование частных символов за пределами модуля.
Наиболее прямолинейный способ – подробное документирование таких симво_ лов. Разработчик модуля должен четко указать в документации, какие функции и прочие свойства представляют общедоступный прикладной интерфейс моду_ ля. Пользователь модуля, в свою очередь, должен ограничиться общедоступным интерфейсом и не поддаться искушению вызвать какую_либо другую функцию или обратиться к какому_нибудь другому свойству.
Одно из соглашений, которое поможет отличать общедоступные символы от част_ ных даже без обращения к документации, заключается в использовании симво_ ла подчеркивания в качестве префикса имен частных символов. Что касается об_ суждаемой функции доступа getCounter(), можно четко обозначить, что свойство counter является частным, изменив его имя на _counter. Это не исключает воз_ можность использования свойства за пределами модуля, но помешает програм_ мисту допустить обращение к частному свойству по неосторожности.
Модули, распространяемые через JSAN, пошли еще дальше. Определения моду_ лей включают в себя массивы, где перечислены все общедоступные символы. Модуль из архива JSAN с именем JSAN включает в себя вспомогательные функ_ ции, с помощью которых можно импортировать символы модуля, и эти функ_ ции отвергают попытки импорта символов, отсутствующих в этих массивах.