Выражение немедленного вызова функции (IIFE) имеет более одного использования. На что вы обращаете внимание, это то, что IIFE не загрязняет глобальную область видимости при объявлении переменной внутри нее (или любых других функций / методов).
Другая важная вещь, которую использует IIFE, заключается в том, что он позволяет вашему коду немедленно запускать без вмешательства чужого кода . Кроме того, IIFE запускается без вызова функции по имени , которая предположительно существует в глобальной области действия .
Ключевым моментом здесь является то, что ваш код не мешает вещам, находящимся в глобальной области видимости, и защищен от внешнего воздействия, поскольку что-либо в глобальной области действия может быть ошибочно перезаписано.
... вы защищаете свой код от кого-то, кто может случайно или глобально изменить ваши глобальные переменные!
Ознакомьтесь с этой средней статьей по Освоение IIFEs для получения дополнительной информации.
Обновление
Хороший пример того, почему ваш второй пример может негативно повлиять на что-то, таков:
Если вы импортируете какую-то библиотеку, и у нее есть метод с именем num
(который библиотека использовала для внутренних целей) в глобальной области (поскольку он не использовал IIFE), ваш второй пример перезапишет этот метод и сделать его непригодным для использования в библиотеке.
Ключевым моментом здесь является то, что это не просто область видимости. Переменные, объявленные в любом методе, относятся к этому методу, а не к глобальной области видимости. Но именованная функция находится в глобальной области видимости.