Apparentemente, ES6 non richiede il namespaces perché ogni file è un modulo separato .
Questa è disinformazione. Per quanto ne so, solo i file che utilizzano
export
sono moduli ES6. Senza
export
, un file ES6 è solo uno script ordinario che ha accesso all'ambito globale a meno che non sia incluso in un IIFE o venga trasformato durante un processo di compilazione.
Revisione (12 luglio 2016): Apparentemente, ho corretto la disinformazione con maggiore disinformazione. Come Kyle Simpson clarifies below, "Secondo le specifiche attuali, ciò che rende un file un modulo ES6 è come l'ambiente (nodo, browser, ecc.) Sceglie di caricarlo, non il suo contenuto."
In You Do not Know JS: ES & Al di là, Kyle Simpson, alias @getify, afferma
"Moduli fanno ancora hanno accesso a finestra e tutti i "globali" che appendere fuori esso , non solo come ambito lessicale di alto livello, ma è davvero necessario che lo rimanga lontano dai globali nei moduli, se possibile. "
Ora alle vostre domande.
[I] sn't il secondo modo, vale a dire, la creazione di uno spazio dei nomi personalizzato con un IIFE, meglio del primo?
Dipende dall'ambiente in cui è in esecuzione il modulo. Ad esempio, in node
, non esiste l'oggetto Window
; pertanto, in quell'ambiente non è necessario preoccuparsi dei moduli che inquinano lo spazio dei nomi globale.
D'altra parte, nel browser, Window
è un'API Web globale e il modulo può accedervi. Tecnicamente, tutto ciò che il tuo modulo si collega a Window
non è, a rigor di termini, globale; tuttavia, tutto ciò che è collegato a Window
è così vicino a un globale che in genere è considerato una cattiva pratica modificarlo tranne tramite Window
.
[H] devo evitare l'interferenza globale nello spazio dei nomi?
e
[I] s là un/modo più nuovo più bello di fare questo in ES2015?
Non so quali sono le migliori pratiche per gestire l'ambito in ES6. Per il momento, faccio la seguente:
- Se un file è un modulo, è ambito di primo livello è il file stesso, quindi non riguardano me stesso con portata globale.
- Se un file non è un modulo, lo avvolgo in un IIFE.
Fonte: You Don't Know JS: ES & Beyond anche raccomandato: ES6 In Depth: Modules da Jason Orendorff
Perché sarebbe la sovrascrittura di un mondiale del genere essere qualcosa ti devi preoccupare? Si potrebbe anche fare 'alert()' comunque. – loganfsmyth
@loganfsmyth perché la finestra [Oggetto globale] (http://www.ecma-international.org/ecma-262/6.0/#sec-global-object) 'ha molte proprietà. Anche la mia app ne avrà alcune e voglio evitare potenziali collisioni di nomi. Si prega di vedere la mia domanda aggiornata. – ma11hew28
Forse c'è qualche errore di comunicazione su questa domanda. La tua preoccupazione nel primo esempio è 'alert === window.alert'? Se è così, questo non è il caso in un vero ambiente ES6, anche se potrebbe farlo con un transpiler. Non è assolutamente il caso quando si usano i moduli ES6 con un adeguato bundler di moduli. – loganfsmyth