Javascript 当Babel和Traceur传输ES6分解结构时,额外变量的用途是什么?

Javascript 当Babel和Traceur传输ES6分解结构时,额外变量的用途是什么?,javascript,babeljs,destructuring,traceur,Javascript,Babeljs,Destructuring,Traceur,Babel和Traceur都可以传输以下代码 obj = { fullName: "Peter", say() { console.log("My name is", this.fullName); } }; let { fullName, say } = obj; 作为 (Traceur使用名称$\uu 1)引入新变量\u obj似乎完全没有必要。它们都这样做的原因是什么?当分解用var声明的变量时,可以重新分配包含当前正在分解的值的变量 var f

Babel和Traceur都可以传输以下代码

obj = {
    fullName: "Peter",
    say() {
        console.log("My name is", this.fullName);
    }
};

let { fullName, say } = obj;
作为


(Traceur使用名称
$\uu 1
)引入新变量
\u 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没有这种优化。我不知道为什么其中任何一个都不会在解构变量实际被重新绑定时只使用局部变量。

您的Transfile目标是否总是允许解构?让我换一句话,您的transfile目标是什么?如果在初始化时添加
Let obj
,则不会发生这种情况。与“严格模式”和隐式全局变量有关吗?@zero298“预设”?(在web界面上)。它是es2015@adiga即使在使用
let obj
时,Traceur仍然会这样做,我猜这可能是处理函数参数的分解的同一代码,在这里您非常需要temp变量。
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"