Construindo uma biblioteca JavaScript, por que usar um IIFE dessa maneira?

Percebi que muitas bibliotecas usam esse estilo abaixo para definir sua biblioteca. Percebo também que a primeira função auto-invocável tem algo a ver com os sistemas Require.js ou AMD, eles sempre têm como argumento a fábrica, vou analisar mais o Require.js, sempre o Browserify.

Por que o código principal é passado no final da primeira função auto-invocável entre parênteses, se é um fechamento ou apenas é considerada uma função anônima, vou me aprofundar em ambos. Quais são os benefícios para isso? Parece que dentro do fechamento o autor passa umstring, thise umcallback.

Isso dará à minha biblioteca uma maneira limpa e segura de globalizar o objeto principal neste exemplo abaixoPlease?

(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(){

Estou tentando me aprofundar no JavaScript e criar minha própria pequena arquitetura MVC, não quero ouvir que sou bobo ou já foi feito antes, quero me desafiar e aprender.

Se houver ótimos recursos para criar uma biblioteca JavaScript ou, melhor ainda, uma biblioteca MVC, eu adoraria saber.