Хотя приведенный вами пример технически является 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, чтобы она лучше соответствовала вашим потребностям с точки зрения расширяемости и удобочитаемости.