Чтобы получить доступ ко всему, это должно быть доступно в области, из которой вы звоните. «Модуль» - или любой другой метод капсуляции - в JS всегда означает «функция». Модуль - это просто анонимная (безымянная) функция. Таким образом, чтобы получить доступ к элементу, определенному в другой функции B (модуле) изнутри функции A, он либо должен быть доступен в ГЛОБАЛЬНОЙ ОБЛАСТИ (в браузерах: объект окна), либо ИЛИ должен получить доступ другим способом, например, получив ссылку через какой-то вызов функции. YUI3 ([http://developer.yahoo.com/yui/3/]) является интересным примером для последнего, там нет ничего из вашего приложения, когда-либо доступного в глобальном масштабе (я считаю, что YUI3 одна из самых лучших JS-фреймворков для разработки SERIOUS softwarfe, также определенно проверяю ) http://developer.yahoo.com/yui/theater/, особенно любые видео от Дугласа Крокфорда, Бога Javascript (и я обычно не даю таких утверждений).
С Javascript нужно помнить, что часть того, что в таких языках, как C, выполняется компилятором, теперь происходит во время выполнения. Для таких вещей, как непосредственные вызовы функций, которые возвращают функцию (вызывая инкапсуляцию посредством использования замыканий), вы должны помнить, что этот код выполняется ТОЛЬКО ОДИН РАЗ В ТЕЧЕНИЕ ЗАГРУЗКИ, но во время выполнения выполняется совершенно другой код - который зависит от того, какой код выполняется при загрузке. сделал.
В вашем примере функция после window.MainModule = ... выполняется при загрузке кода JS. Обратите внимание, что window.MainModule НЕ УКАЗЫВАЕТ НА ЭТО ФУНКЦИЮ !!!
Вместо этого эта функция, как я уже сказал, выполняется под нагрузкой, и RESULT присваивается window.MainModule. Что в итоге? Ну, есть только один оператор return, и он возвращает и объект, и у объекта есть только одно свойство «init», которое указывает на анонимную функцию.
Однако перед возвратом этого объекта эта функция создает переменную «модули» в своей локальной области видимости, которая указывает на объект. У объекта есть два свойства, и этим свойствам назначаются функции так же, как и в window.MainModule, поэтому у вас всего три замыкания.
Итак, после загрузки у вас есть одна глобальная переменная
window.MainModule = {
init: function () {...}
Итак, после загрузки у вас есть одна глобальная переменная
window.MainModule = {
init: function () {...}
}
В последней строке эта функция выполняется.
}
В последней строке эта функция выполняется.
Этот пример не имеет большого смысла, потому что вы ничего не инкапсулируете. Вы делаете доступной приватную функцию с двойными указателями: от init до локальной переменной someFunction, ничего не скрыто. Проверьте приведенные выше URL (Yahoo Developer Theater) для лучших примеров и очень подробных объяснений. Это ОБЯЗАТЕЛЬНО, даже если вы никогда не трогаете YUI3 - особенно видео Д. Крокфорда - это общее ноу-хау JS.