0

次のクラスの「データ」メソッドを見てください。メソッド本体には「result」という変数が含まれており、else if 句で配列に再割り当てされます。

何らかの理由で、babel は前述の変数の先頭にアンダースコアを付けてトランスパイルします。

ES6 クラス:

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;
  }

  // ...
}

トランスパイルされたメソッド:

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;
    }
4

1 に答える 1

2

resultは、 を使用して再割り当てされるだけでなく、再宣言されているため、現在のブロック ( else ifletブロック)にスコープされます。

varブロックのスコープに準拠していない にトランスパイルされた場合、2 番目の宣言が最初の宣言を上書きしてはなりません。

それは基本的にこれの違いです:

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

この:

var a = 123;
if (true) {
  var a = 456;
}
// a === 456
于 2016-06-24T12:51:30.930 に答える