与巴贝尔游乐场的意外领先下划线

时间:2016-06-24 12:28:09

标签: javascript ecmascript-6 babeljs transpiler

看看下面的类“数据”方法。方法体包含 一个名为“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;
    }

1 个答案:

答案 0 :(得分: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