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