使用babel进行编译时,ES6的let和const仅在编译时有效吗?

时间:2019-02-13 11:12:34

标签: javascript ecmascript-6 babeljs

我在babel的官方REPL中尝试了babel,发现letconst仅编译为var

这是否意味着letconst仅在编译时生效?还是letconst在编译后的代码中生效?

3 个答案:

答案 0 :(得分:4)

Babel使用escape analysis来确定varlet的使用方式之间是否确实存在功能差异-因此:

let x = 5;

通常只是编译为

var x = 5;

位置:

let x = 5;
{ 
  let x = 10;
}

被编译为:

var x = 5;
{
  var x2 = 10; // _x actually, 
}

之所以这样做,是因为它比旧的编译器(例如traceur)在ES5中阻止作用域的速度快得多。在ES5中实际上可以进行块范围界定-确实很丑陋:

let x = 5;

被编译为:

try { throw 5; } catch (x) {
  // x defined in this scope
}

答案 1 :(得分:1)

Babel编译的内容取决于您使用的预设。

查看此示例here。在左侧面板上,您可以更改预设。单击这些预设,您会注意到编译后的代码如何更改。

如果使用constlet预设,Babel只会将vares2015编译为es2015-loose。您使用的是哪种预设取决于您的要求,您必须支持哪些浏览器。

正如本杰明在他的回答中指出的那样,如果您使用es2015预设,Babel仍将以某种方式进行编译,其中constlet的概念将得到保留。

答案 2 :(得分:0)

out = new BufferedWriter( new OutputStreamWriter(connection.getOutputStream()) ); out.write(getOutput(hm)); out.close(); 实际上是widely supported natively,包括IE11。

Similarly for const,但在IE11中有一个小警告。

因此-除非您的目标是IE10及更低版本,否则无需再进行移植。