Ответ 1
Это раскрывающий шаблон модуля.
Возвращаемый объект содержит ссылки на функции, определенные внутри IIFE. Таким образом, функции, определенные внутри, являются частными для анонимной функции.
Но если вы хотите использовать внутренние функции снаружи, вы можете использовать возвращенный объект.
Значение Test
будет
var Test = {
func1: func1,
func2: func2,
func3: func3
};
И вы можете вызвать func1
извне как
Test.func1();
Вот как Javascript эмулирует класс. Поскольку нет спецификаторов видимости, использующих шаблон модуля, переменные/методы могут быть общедоступными/частными.
Образцовый шаблон модуля вдохновлен шаблоном модуля. При отображении шаблона модуля в объекте возвращается только ссылка на частные переменные/методы.
Основная идея шаблона - избегать злых глобальных переменных. Это похоже на IIFE, за исключением того, что вместо функции возвращается объект. Переменные/методы, определенные внутри IIFE, являются частными для функции. Чтобы получить доступ к любой переменной/методу внутри IIFE, его необходимо добавить в возвращаемый объект, а затем к нему можно получить доступ из-за пределов IIFE. Этот шаблон использует преимущества замыканий, поэтому переменные/методы, определенные внутри IIFE, доступны даже после возвращения объекта.
Из книги Addy Osmani Изучение шаблонов проектирования Javascript
Схема раскрывающегося модуля возникла, поскольку Хейлманн был расстроен тем фактом, что ему пришлось повторить имя основного объекта, когда мы хотели вызвать один общедоступный метод из другого или получить доступ к общедоступным переменным. Он также не любил требования к шаблонам модуля для того, чтобы переключиться на объектную литературу для того, что он хотел обнародовать.
Результатом его усилий стал обновленный шаблон, в котором мы просто определяли бы все наши функции и переменные в частной области и возвращали анонимный объект с указателями на частную функциональность, которую мы хотели раскрыть как общедоступную.
<сильные > Преимущества:
- Герметизация. Код внутри IIFE инкапсулирован из внешнего мира
- Чистый, организованный и многоразовый код
- Конфиденциальность. Это позволяет создавать частные переменные/методы. Частные переменные/методы не могут быть затронуты из-за пределов IIFE.
Недостатки:
- Если частная функция относится к публичной функции, эта публичная функция не может быть переопределена
Дальнейшее чтение:
- https://en.wikipedia.org/wiki/Module_pattern
- https://carldanley.com/js-revealing-module-pattern/
- Как использовать раскрытие шаблона модуля в JavaScript
ИЗМЕНИТЬ
Следует отметить, что он является общим для создания объекта (например,
var me = {};
), а затем объявляет на него публичные члены (me.func1 = function() { /* ... */ };
), возвращая этот объект в конец (return me;
). Это позволяет избежать повторения, которое мы видим в операторе return кода OP (где повторяется все общедоступные вещи).