我在babel的官方REPL中尝试了babel,发现let
,const
仅编译为var
。
这是否意味着let
和const
仅在编译时生效?还是let
和const
在编译后的代码中生效?
答案 0 :(得分:4)
Babel使用escape analysis来确定var
和let
的使用方式之间是否确实存在功能差异-因此:
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。在左侧面板上,您可以更改预设。单击这些预设,您会注意到编译后的代码如何更改。
如果使用const
或let
预设,Babel只会将var
和es2015
编译为es2015-loose
。您使用的是哪种预设取决于您的要求,您必须支持哪些浏览器。
正如本杰明在他的回答中指出的那样,如果您使用es2015
预设,Babel仍将以某种方式进行编译,其中const
和let
的概念将得到保留。
答案 2 :(得分:0)
out = new BufferedWriter(
new OutputStreamWriter(connection.getOutputStream())
);
out.write(getOutput(hm));
out.close();
实际上是widely supported natively,包括IE11。
Similarly for const
,但在IE11中有一个小警告。
因此-除非您的目标是IE10及更低版本,否则无需再进行移植。