Создавая библиотеку JavaScript, зачем использовать IIFE таким образом?

Я заметил, что многие библиотеки используют этот стиль ниже, чтобы определить свою библиотеку. Я также заметил, что первая самозапускающаяся функция имеет какое-то отношение к системам Require.js или AMD, в качестве аргумента у них всегда есть фабрика, я подробнее расскажу о Require.js, всегда в Browserify.

Почему основной код передается в конец первой самопризывающей функции в скобках, является ли это закрытием или просто считается анонимной функцией, я углублюсь в обе. Каковы преимущества этого? Похоже, что в закрытии автор передаетstring, thisиcallback.

Это даст моей библиотеке чистый безопасный способ глобализации основного объекта в этом примере нижеPlease?

(function( globalName, root, factory ) {
    if ( typeof define === 'function' && define.amd ) {
        define( [], factory );
    }
    else if ( typeof exports === 'object' ) {
        module.exports = factory();
    }
    else{
        root[globalName] = factory();
    }
}('Please', this, function(){

Я пытаюсь действительно глубоко погрузиться в JavaScript и создать свою собственную маленькую архитектуру MVC, я не хочу слышать, что я глуп, или это было сделано раньше, я хочу испытать себя и учиться.

Если есть какие-то большие ресурсы для создания библиотеки JavaScript или даже лучше библиотеки MVC, я бы хотел знать.