Как грамотнее разделить общение между взаимозависимыми модулями js приложения?
Если я правильно понял вопрос, то в js для взаимодействия между модулями можно использовать событийно ориентированный подход.
Допустим у вас есть объект Events для работы с событиями. У него есть функция setListener(eventName, eventHandler), где eventName - название события, а eventHandler - функция-обработчик. В одном из модулей вы можете подписаться на событие.
В Events есть так же функция trigger(eventName, data), которая вызывает все обработчики, подписанные на события eventName, передавая им параметр data. В другом модуле вы соответственно вызываете эту функцию, и если какие-то другие модули подписывались на эти события - будут вызваны их обработчики.
С одной стороны подход очень гибкий и удобный, достаточно широко используется. С другой стороны бывают трудности: не всегда очевидно, что и почему вызывается.
Дополняя ответ выше, дам ссылку на презентацию Яндекса по этому вопросу.
Думаю многое стане более понятно насчёт событий.
http://tech.yandex.ru/events/yasubbotnik/chlb-feb-2012/talks/154/