Primeiro, algumas coisas:
Outra maneira de ver o JavaScript é o 1 milhão e o 1 de coisas que você pode fazer com a função como uma construção. Está tudo lá, se você procurar. Apenas nunca está longe de uma função.
Essa coisa de criação de plug-in do jQuery é horrível. Eu não tenho idéia do por que eles estão defendendo isso. As extensões $ devem ser coisas de uso geral que o $ já possui métodos muito bem cobertos, e não o widget construir-me-um-completo-widget. É uma ferramenta de normalização da API do DOM. É melhor usá-lo dentro de seus próprios objetos. Não vejo o apelo de usá-lo como um repositório completo de bibliotecas da interface do usuário.
Pacotes na Web do lado do cliente são inúteis
O que eu pessoalmente não gosto nos pacotes na Web do lado do cliente é que basicamente estaríamos fingindo que estamos fazendo algo que realmente não estamos. Em um mundo pós-.NET, webforms e coisas horríveis que nunca saíram dos nossos amigos Java, eu prefiro pensar em um pedaço de HTML com recursos vinculados como realmente é e não tente apaziguar os desenvolvedores de aplicativos de SO que aprendem coisas novas e resistentes, fingindo que é outra coisa. No JS, na Web do lado do cliente, nada é "importado", exceto quando o Ajax faz algo horrível que opera na ignorância do cache do navegador, o que sim, muitos tentaram fazer. O que importa para o navegador é que ele foi carregado e interpretado ou não. Não temos mais código oculto no cliente em algum lugar disponível para uso "apenas no caso" por boas razões. A primeira é que acabei de descrever as dependências de plug-in e de navegador para aplicativos da web como um fenômeno que geralmente não funcionou muito bem. Queremos web agora. Não após a atualização da Adobe ou da Sun pela terceira vez nesta semana.
A linguagem tem o que precisa para estrutura
Objetos JS são altamente mutáveis. Podemos ter árvores ramificadas de namespaces em qualquer grau que acharmos útil e é muito fácil. Mas sim, para qualquer coisa reutilizável, você precisa manter a raiz de qualquer biblioteca no espaço global. Todas as dependências são vinculadas e carregadas ao mesmo tempo de qualquer maneira, então qual é o sentido de fazer mais alguma coisa? O objetivo de evitar o espaço para nome global não é que haja algo ruim. É muita coisa ruim porque você corre o risco de colisões de namespace ou sobrescrever acidentalmente os principais recursos da linguagem.
Só porque é popular, não significa que estamos fazendo certo
Agora, quando você vir isso em um aplicativo Web do lado do cliente:
(function(){
//lots of functions defined and fired and statement code here
})()
O problema não é que não temos ferramentas para estruturar um aplicativo, o problema é que as pessoas não estão avaliando a estrutura. Para sites descartáveis temporários únicos de 2-3 páginas em uma agência de design, eu realmente não tenho problemas com isso. Onde fica feio é quando você precisa criar algo que possa ser mantido, legível e fácil de modificar.
Mas quando você chega ao local em que é hora de implementar todos os objetos e fábricas reutilizáveis e talvez um ou dois novos vars temporários entrem nesse processo, é uma conveniência.
Mas existem implementações de JS com pacotes / módulos
Lembre-se de que no Node.js, onde essas coisas fazem muito mais sentido, elas têm módulos. JS, supondo que possamos evitar o uber-config-hell que atormenta outras linguagens, é a única coisa na equação e cada arquivo executado é seu próprio escopo isolado. Mas em uma página da web, vincular um arquivo js é a própria declaração de importação. Fazer mais importações dinamicamente é apenas um desperdício de tempo e recursos, uma vez que a obtenção dos recursos exige muito mais esforço do que simplesmente adicionar links aos arquivos conforme necessário, sabendo que eles serão armazenados em cache no navegador se outra página precisar deles novamente. Assim, está tentando dividir o espaço global fazendo algo diferente de criar fábricas de objetos adaptadores como jQuery ou objetos mais tradicionais que abrangem um grande subconjunto de tarefas em um determinado domínio enquanto ocupam um lugar no global. Lá'http://wiki.ecmascript.org/doku.php?id=harmony:modules
Portanto, não, não há nada errado com os invocadores automáticos usados para evitar a poluição do espaço de nomes global quando há uma boa razão para usar essas coisas (na maioria das vezes não existe). E temos propriedades equivalentes privadas persistentes em nossos objetos (apenas defina uma var no construtor e não a exponha como uma propriedade).
O fato de podermos fazer essas coisas, no entanto, é impressionante. O uso pesado é um sinal de que os desenvolvedores de JS ainda estão amadurecendo, talvez, mas não é um buraco na linguagem para quem não está tentando forçar um paradigma na Web do lado do cliente que simplesmente não faz sentido aqui.