Prima di tutto, un paio di cose:
-
Un altro modo di guardare JavaScript è il 1 milione e 1 cose che puoi fare con la funzione come costrutto. È tutto lì se lo cerchi. Non è mai lontano da una funzione.
-
Questa cosa di authoring plug-in jQuery è orribile. Non ho idea del motivo per cui lo stanno sostenendo. $ estensioni dovrebbero essere roba di uso generale che $ ha già abbastanza ben coperto dai metodi build-me-a-complete-widget. È uno strumento di normalizzazione DOM-API. Il suo uso è meglio seppellito all'interno dei tuoi oggetti. Non vedo l'attrattiva di utilizzarlo come un repository di librerie dell'interfaccia utente completo.
I pacchetti sul lato client Web sono inutili
Ciò che non mi piace personalmente dei pacchetti sul web lato client è che fondamentalmente fingiamo di fare qualcosa che in realtà non lo è. In un post Web .NET e un mondo di orrori-di-orrore-roba-mai-spazzato via dal nostro-Java, preferirei pensare a un pezzo di HTML con risorse collegate come quello che è veramente e non cercare di placare gli sviluppatori di app del sistema operativo di apprendimento-nuove-cose-resistenti fingendo che sia qualcos'altro. In JS sul Web lato client, niente viene "importato" salvo fare qualcosa di terribile con Ajax che opera nell'ignoranza del caching del browser, che sì, molti hanno provato a fare. Tutto ciò che conta per il browser è che è stato caricato e interpretato o non lo è stato. Non abbiamo più codice memorizzato sul client da qualche parte disponibile per l'uso "just in case" per buone ragioni. # 1 è che ho appena descritto un plug-in e dipendenze plug-in del browser per le applicazioni web come un fenomeno non ha generalmente funzionato troppo bene. Vogliamo il web ora. Non dopo che Adobe o Sun sono stati aggiornati la terza volta questa settimana.
Il linguaggio ha ciò di cui ha bisogno per la struttura
Gli oggetti JS sono altamente mutabili. Possiamo avere alberi ramificati di spazi dei nomi in qualsiasi misura che riteniamo utile farlo ed è molto facile da fare. Ma sì, per qualsiasi cosa riutilizzabile devi attaccare la radice di qualsiasi libreria nello spazio globale. Tutte le dipendenze sono collegate e caricate allo stesso tempo, quindi qual è il punto di fare qualcos'altro? Il punto di evitare lo spazio dei nomi globale non è che nulla ci sia di male. È che troppe cose non sono buone perché corri il rischio di collisioni nello spazio dei nomi o sovrascrive accidentalmente le funzionalità del linguaggio principale.
Solo perché è popolare, non significa che lo stiamo facendo bene
Ora quando lo vedi su un'app web sul lato client:
(function(){
//lots of functions defined and fired and statement code here
})()
Il problema non è che mancano strumenti per strutturare un'applicazione, il problema è che le persone non valutano la struttura. Per siti temporanei e temporanei di 2-3 pagine in un'agenzia di design, non ho davvero un problema con questo. Dove diventa brutto è quando devi costruire qualcosa di manutenibile e leggibile e facile da modificare.
Ma quando arrivi al punto in cui è tempo di implementare solo tutti gli oggetti e le fabbriche riutilizzabili e forse una o due nuove alternative temporanee potrebbero insinuarsi in quel processo, è una comodità.
Ma esistono implementazioni di JS con pacchetti / moduli
Tieni presente che in Node.js, dove queste cose hanno molto più senso, hanno moduli. JS, supponendo che possiamo evitare l'inferno-config-inferno che affligge altri linguaggi, è l'unica cosa nell'equazione e ogni file eseguito è il suo ambito isolato. Ma su una pagina web, il collegamento di un file js è di per sé la dichiarazione di importazione. Fare più importazioni al volo è solo uno spreco di tempo e risorse poiché ottenere risorse richiede molto più sforzo rispetto alla semplice aggiunta di collegamenti ai file quando ne hai bisogno, sapendo che saranno memorizzati nella cache di un browser se un'altra pagina ne ha bisogno. Così sta provando a suddividere lo spazio globale facendo qualcosa di diverso da creare fabbriche di oggetti adattatore come jQuery o più oggetti tradizionali che coprono un ampio sottoinsieme di compiti in un dato dominio mentre occupano un posto in globale. Ci sono anche degli sforzi in corso per scrivere effettivamente i moduli nelle specifiche future: link
Quindi no, non c'è niente di sbagliato con gli auto-invocatori usati per evitare l'inquinamento dello spazio dei nomi globale quando c'è una buona ragione per usare queste cose (il più delle volte no). E abbiamo proprietà persistenti private-equivalenti nei nostri oggetti (basta definire una var nel costruttore e non esporlo come una proprietà).
Il fatto che siamo in grado di fare cose del genere, tuttavia, è fantastico. L'uso pesante è un segno che gli sviluppatori JS stanno ancora maturando forse, ma non è un buco nel linguaggio di nessuno che non sta cercando di forzare un paradigma nel web lato client che non ha senso qui.