2015-12-15 7 views
7

non posso transpile questo piccolo pezzo di codice:'super' di funzione o di classe

class FooBar extends SomeParent { 

    constructor() { 
    super(); 
    } 

    start() { 
    var foo = function() { 
     super.start();  // <-- Error: 'super' outside of function or class 
    }; 
    } 
} 

L'errore gettato è 'super' outside of function or class.

Tuttavia, lo stesso codice traspone bene in Babel REPL.

Sto transpiling utilizzando un programma Node.JS personalizzati utilizzando questo comando: informazioni

babel.transformFileSync(filename, { presets: [ 'es2015' ] }); 

Installazione:

$ npm ls --global --depth 0 
/usr/lib 
├── [email protected] 
├── [email protected] 
├── [email protected] 
├── [email protected] 
├── [email protected] 
├── [email protected] 
├── [email protected] 
├── [email protected] 
├── [email protected] 
└── [email protected] 

$ node -v 
v0.10.40 

Che cosa sto facendo di sbagliato? Non ho avuto problemi durante il transpiling usando Babel 5 ...

+0

Potrebbe essere che il REPL usi babele 5 e stai usando babele 6? – Jivings

+4

Usa una funzione freccia invece di una funzione regolare, che assicurerà che il 'super' provenga dall'ambito genitore. Non sono sicuro di quale implementazione sia corretta, ma vorrei * indovinare * Babel 6 in quanto non ha senso accedere a 'super' al di fuori della classe – CodingIntrigue

+0

Per favore vedi [" Le domande dovrebbero includere "tag" nei loro titoli? "] (http://meta.stackexchange.com/questions/19190/should-questions-include-tags-in-their-titles), dove il consenso è" no, non dovrebbero "! –

risposta

4

Funziona in REPL Babel perché Babel 5 non aveva assegni per questo, direi.

Questo non è valido:

class Example extends Parent { 
    start() { 
    var foo = function() { 
     super.start(); 
    }; 
    } 
} 

Ma utilizzando una funzione di freccia fa:

class Example extends Parent { 
    start() { 
    var foo =() => { 
     super.start(); 
    }; 
    } 
} 

perché super comportamento si basa sulla this ambiente della sua posizione chiamando. Mentre una funzione freccia condivide il suo ambiente this con il relativo genitore, una funzione standard introduce un intero ambiente non this.

particolare:

  1. 12.3.5.1 chiamate MakeSuperPropertyReference()
  2. 12.3.5.3 chiamate GetThisEnvironment() che nel primo caso sarà l'espressione di funzione, e nel caso freccia sarà il metodo di classe, e quindi chiama HasSuperBinding() in tale ambiente .
  3. 8.1.1.3.3 restituirà false nel primo caso perché le espressioni di funzione non hanno un [[HomeObject]] mentre i metodi di classe lo fanno.
+0

grazie per la buona spiegazione! –