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