Это очень распространенный инструмент, его цель — скрыть внутренние детали реализации скрипта. В том числе: временные переменные, константы, вспомогательные мини-функции и т.п.
К примеру мы подключаем к проекту скрипт. Предположим, что в скрипте инициализирована переменная message, но и в самом проекте так же инициализирована переменная с таким же названием message:


Тогда у нас будет конфликт переменных, чтобы избежать этого используется прием проектирования «Модуль».
Скрипт, оформленный как модуль:

Теперь код заработает корректно.
Общее правило таково:
· Если браузер видит function в основном потоке кода — он считает, что это Function Declaration.
· Если же function идёт в составе более сложного выражения, то он считает, что это Function Expression.