2015-12-05 16 views
8

Ho letto here che non è necessario inserire un punto e virgola dopo le esportazioni predefinite. Quindi, questo programma ha un punto e virgola inutile:Punto e virgola dopo l'esportazione predefinita

export default function() {}; 

Ma se il mio modulo continua in questo modo:

export default function() {}; 

(() => { 
    // creating a new function scope 
})(); 

allora non può lasciare il punto e virgola.

Quindi cosa sta succedendo qui? La grammatica dice che non ho bisogno del punto e virgola, ma se lo lascio il codice significa qualcos'altro?

UPDATE:

Se lascio il punto e virgola:

export default function() {} 

(() => { 
    // creating a new function scope 
})(); 

allora la funzione esportata viene chiamata invece di essere esportato. babeljs.io compila quest'ultimo in:

"use strict"; 

Object.defineProperty(exports, "__esModule", { 
    value: true 
}); 

exports["default"] = (function() {})(function() { 
    // creating a new function scope 
})(); 

; 
module.exports = exports["default"]; 

Più precisamente dopo che viene chiamato viene generato un errore, perché il valore di ritorno della prima funzione anche viene chiamata (ma che non è una funzione). L'errore che ottengo in cromo è questo:

Uncaught TypeError: (intermediate value)(...) is not a function(…) 
+0

Cosa ti impedisce di lasciare il punto e virgola nel secondo caso? Qualcosa ti dà un errore? – loganfsmyth

+0

@loganfsmyth si veda il mio aggiornamento –

+0

possibile duplicato di [Esportazione predefinita in ES6. Perché non hai bisogno di un punto e virgola?] (Http://stackoverflow.com/q/33482309/1048572) (se la tua domanda non riguardava il bug di babele) – Bergi

risposta

10

Non è necessario aggiungere un punto e virgola dopo un export default quando è seguito da una dichiarazione di funzione, che è ciò che il grammar dice.

Babele è sbagliato, ho filed a bug contro di esso. Quel codice dovrebbe essere interpretato come l'esportazione della funzione e quindi l'esecuzione dell'IIFE come IIFE.

+0

Io non sono completamente sicuro che sia vero, in questo caso è ancora una dichiarazione di funzione, piuttosto che un'espressione di funzione, quindi non dovrebbe richiedere un punto e virgola. Generalmente per la sintassi di esportazione, la questione del punto e virgola dipende se avrebbe avuto un punto e virgola se si è esclusa la parte 'export' dall'istruzione – loganfsmyth

+0

Hmm http://www.ecma-international.org/ecma-262/6.0/#sec-exports (è una dichiarazione di Hoistable se non si è a conoscenza) –

+1

@loganfsmyth è una dichiarazione di funzione che richiede il punto e virgola per impedire l'automatico inserimento del punto e virgola. In ES5, in ES5, non c'è stato alcun caso e infatti il ​​punto e virgola non fa parte dell'affermazione e non viene inserito automaticamente, caso interessante. Mi chiedo se la grammatica debba essere modificata. Lo solleverò in esdiscuss. –