2015-10-06 13 views
6

Se hoÈ richiesto un IIFE intorno alla classe in ECMAScript/Javascript 6?

Class Car {} 

ho bisogno per avvolgere che con la nostra funzione di chiusura? I var vengono issati alla finestra? o solo alla classe? Che dire quando è transpiled? Traceur/babel lo trasforma in un IIFE e entriamo in var?

Devo:

(function(){ 
    Class Car() {} 
}()); 

di essere al sicuro?

+1

Ciò dipenderà dal caricamento del file come script o come modulo. Come stai caricando il file? – loganfsmyth

+0

Nativamente, è davvero una bella domanda. Testato qui con Edge, e sebbene io possa avere un file 'car.js' con quella dichiarazione di classe, e un file' new-car.js' usando quella classe, se registro 'Car' nella console, mi mostra il costruttore, ma se registro 'window.Car', mostra' undefined'. – Buzinas

+0

@Buzinas: È un po 'diverso. Le dichiarazioni lessicali ('class',' let' e 'const') non diventano proprietà dell'oggetto globale. –

risposta

1

Si può avere uno sguardo a ciò che accade quando Babel transpiles il codice here

Non è necessario utilizzare un IIFE a meno che non si vuole nascondere la classe, e la var Class che viene generato viene issato come qualsiasi variabile: la dichiarazione avrà luogo all'inizio, ma l'assegnazione avverrà nella linea originale.

E sì, Babel gira let in var, ma si occupa anche degli scoping come previsto con gli extra. Se vuoi solo scrivere il codice ES6 ed eseguirlo, non dovresti preoccuparti di questi dettagli, basta seguire lo standard ES6 (ES2015).

1

No, non è necessario avvolgerlo in questo modo finché è in codice come un modulo ES6. Le impostazioni predefinite di Babel trattano il codice di input e i file come moduli. Babel introduce funzioni in vari punti per implementare la semantica di scoping corretta e trasforma let in var se il trasformatore applicabile è abilitato.

moduli ES6 sono sempre in modalità rigorosa ed ecco cosa dice la specifica su incarico in modalità rigorosa:

Assegnazione a un identificatore non dichiarato o di riferimento altrimenti irrisolvibile non creare una proprietà nell'oggetto globale. Quando si verifica un semplice assegnamento all'interno di un codice di modalità rigoroso, il suo LeftHandSide non deve valutare un riferimento irrisolvibile.

http://www.ecma-international.org/ecma-262/6.0/#sec-strict-mode-of-ecmascript

Che cosa esattamente cosa si intende per ?:

fare var Otteniamo issato a [...] la classe?

2

Non è necessario che sia un wrapper IIFE per l'auto di classe come mostrato qui, infatti creerà un contesto di esecuzione e nasconde la classe dal resto della pagina.

Quindi, si sarebbe solo lasciare come (non è il caso inferiore)

class Car(){} 

Var è ancora issato nello stesso modo che era prima. Verrà issato in cima al contesto di esecuzione. Se il codice è attualmente nel contesto della finestra, è qui che la variabile finirà.

Le classi sono non issate in ECMAScript 6. Quindi la classe sarà disponibile solo dopo che è stata dichiarata.

+0

Le classi vengono sollevate, il che significa che il * binding * viene creato quando si entra nello scope, ma non è inizializzato. Si comporta come 'let'. –

+0

@FelixKling - Questo è quello che dice su MDN. https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Classes "Una differenza importante tra le dichiarazioni di funzione e le dichiarazioni di classe è che le dichiarazioni di funzione sono issate e le dichiarazioni di classe non lo sono." L'ho interpretato in modo errato? Sembra piuttosto diretto. –

+0

Mmh, mi riferivo a ciò che è scritto in http://www.ecma-international.org/ecma-262/6.0/#sec-functiondeclarationinstantiation, passaggio 35. Ma immagino che "issare" abbia un significato diverso da quello che pensavo (può essere?). le classi e le dichiarazioni di let' non sono considerate come HoistableDeclaration nelle specifiche, quindi credo di aver sbagliato. Tuttavia, anche le specifiche non sembrano descrivere esplicitamente il termine "sollevamento". –