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正在被重新声明,而不仅仅是重新分配,使用let,因此范围限定为当前块(else if块)。

当转换为var不遵守块作用域的 时,第二个声明不应覆盖第一个声明。

这基本上是这之间的区别:

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 回答