У моей команды нет опытных разработчиков JS, но мы пишем библиотеку в Node и получили предложение от реального разработчика JS: "Мы должны сделать js более модульным - не загрязнять глобальное пространство имен и чтобы сделать его более читаемым для новичков", и сказал нам сделать следующее:
module.exports = (function(){
return {
nameToExpose: functionToExpose
...
};
})();
а не
module.exports.nameToExpose = functionToExpose;
В чем смысл этого, если таковой имеется? Последнее не делает никаких локальных заявлений, которые будут охвачены IIFE, и даже если бы это было так, они были бы локальными для файла модуля, а не глобальными для всей программы, которые require()
it.
Некоторые поисковые запросы и высказывание об этом сайте не дают ответов на этот конкретный вопрос, хотя есть много других объяснений IIFE, которые я прочитал (и которые обобщены в вышеупомянутом комментарии). Некоторое тестирование, безусловно, показывает, что последнее фактически не помещает functionToExpose
в глобальное пространство имен, хотя его исходное имя записывается в самом виде функции.