Хотя приведенный вами пример технически является IIFE в самом строгом смысле слова, более типичный пример IIFE является многоразовым и имеет как открытые, так и частные члены. Цель состоит в том, чтобы реализовать RMP (Выявление шаблона модуля) для определения всех членов, как общедоступных, так и частных, через закрывающие переменные, возврата литерала объекта без определений функций и получения всех ссылок через закрывающие переменные. Рассмотрим следующий пример:

var Math = (function() {
  const addReducer = (acc, val) => acc + val;
function add(values) {
    return values.reduce(sumReducer, 0);
  }
function addTwoArgs(a, b) {
    return add([a, b]);
  }
function addThreeArgs(a, b, c) {
    return add([a, b, c]);
  }
return {
    sum1: addTwoArgs,
    sum2: addThreeArgs
  };
})();
Math.sum1(1, 2, 3); // 3
Math.sum2(1, 2, 3); // 6

Здесь у вас есть частные члены add и addReducer, которые инкапсулируют функциональность, и литерал возвращаемого объекта, который позволяет вам переименовывать или скрывать любые закрывающие переменные.

А что, если функция add была более сложной и импортировалась из другого модуля? Затем вы можете украсить функцию add, чтобы она лучше соответствовала вашим потребностям с точки зрения расширяемости и удобочитаемости.