当Babel和Traceur转换ES6解构时,额外变量的目的是什么?

问题描述 投票:3回答:1

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。他们俩都这样做的原因是什么?

javascript babel destructuring traceur
1个回答
2
投票

解构用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没有这种优化。我不确定为什么当重组后的变量实际上被重新绑定时,为什么不只使用局部变量。

© www.soinside.com 2019 - 2024. All rights reserved.