Babel和Traceur都将为以下代码进行转换
obj = {
fullName: "Peter",
say() {
console.log("My name is", this.fullName);
}
};
let { fullName, say } = obj;
as
"use strict";
obj = {
fullName: "Peter",
say: function say() {
console.log("My name is", this.fullName);
}
};
var _obj = obj,
fullName = _obj.fullName,
say = _obj.say;
(Traceur使用名称$__1
)似乎没有必要引入新变量_obj
。他们俩都这样做的原因是什么?
解构用var
声明的变量时,可以重新分配包含您当前要解构的值的变量。]>
var foo = { foo: 1, bar: 2 }; var {foo, bar} = foo; console.log(`foo: ${foo}, bar: ${bar}`); // outputs "foo: 1, bar: 2"
如果在不创建临时变量的情况下天真地进行了转译,则在获取bar的值之前,将更改变量foo:
var foo = { foo: 1, bar: 2 }; var foo = foo.foo; var bar = foo.bar; console.log(`foo: ${foo}, bar: ${bar}`); // outputs "foo: 1, bar: undefined"
[我的猜测是Babel进行了优化,可以将其识别为
let
绑定不是必需的,因为那样的话,在重新绑定同一变量时会出现错误。显然,Traceur没有这种优化。我不确定为什么当重组后的变量实际上被重新绑定时,为什么不只使用局部变量。