Construyendo una biblioteca JavaScript, ¿por qué usar un IIFE de esta manera?

He notado que muchas bibliotecas usan este estilo a continuación para definir su biblioteca. También me doy cuenta de que la primera función de auto invocación tiene algo que ver con los sistemas Require.js o AMD, siempre tienen una fábrica como argumento, buscaré más en Require.js, siempre he estado en Browserify.

¿Por qué se pasa el código principal al final de la primera función de auto invocación dentro de paréntesis? ¿Es este un cierre o simplemente se considera una función anónima? Profundizaré en ambos. ¿Cuáles son los beneficios de esto? Parece que dentro del cierre el autor pasa unstring, thisy uncallback.

¿Esto le dará a mi biblioteca una forma limpia y segura de globalizar el objeto principal en este ejemplo a continuación?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(){

Estoy tratando de profundizar en JavaScript y crear mi propia arquitectura MVC pequeña, no quiero escuchar que soy tonto o que ya se ha hecho antes, quiero desafiarme y aprender.

Si hay grandes recursos para crear una biblioteca de JavaScript o incluso mejor una biblioteca de MVC, me encantaría saberlo.

Respuestas a la pregunta(2)

Su respuesta a la pregunta