2016-06-24 1 views
0

Jetez un coup d'œil à la méthode "data" de la classe suivante. Le corps de la méthode contient une variable appelée "result" et est réaffectée dans la clause else if à un tableau.Un trait de soulignement inattendu avec le terrain de jeu de babel

Pour certaines raisons, babel transpile la variable précitée avec un trait de soulignement.

ES6 Classe:

class Serie { 
    constructor(name, data = []) { 
    Object.defineProperty(this, "name", { 
     enumerable: false, 
     configurable: false, 
     writable: false, 
     value: name 
    }) 

    data.map((v, i) => this[v.name] = v.value); 
    } 

    data(name) { 
    let result = null; 

    if (arguments.length == 1) { 
     result = this.hasOwnProperty(name) ? this[ name ] : result; 
    } 
    else if (arguments.length == 0) { 
     let keys = Object.keys(this), 
      i  = keys.length, 
      result = []; 

     while (i--) { 
     result.push(this[ keys[i] ]); 
     } 
    } 

    return result; 
    } 

    // ... 
} 

La méthode transpiled:

function data(name) { 
     var result = null; 

     if (arguments.length == 1) { 
     result = this.hasOwnProperty(name) ? this[name] : result; 
     } else if (arguments.length == 0) { 
     var keys = Object.keys(this), 
      i = keys.length, 
      _result = []; 

     while (i--) { 
      _result.push(this[keys[i]]); 
     } 
     } 

     return result; 
    } 

Répondre

2

result est d'être re- déclaré, non seulement réaffectés, en utilisant let, donc scope au bloc courant (le sinon, si bloc). Lorsqu'elle est passée à var, qui ne respecte pas la portée du bloc, la seconde déclaration ne doit pas écraser la première.

Il est fondamentalement la différence entre ceci:

let a = 123; 
if (true) { 
    let a = 456; 
} 
// a === 123 

Et ceci:

var a = 123; 
if (true) { 
    var a = 456; 
} 
// a === 456 
+0

Oh merde! J'ai totalement raté ça. Je vous remercie. –